use serde_json::json;
use super::*;
use crate::commands::copy::plan::ChangeKind;
const INLINE_SECTION: &str = "\
repo = \"/srv/project\"
worker = { timeout = 30, allowed_domains = [\"github.com\"] }
fetch = { git = { merging = \"ff\" } }
";
fn inline_plan(keys: &[&str], value: Json) -> Result<Plan, WriteRefusal> {
let doc = INLINE_SECTION.parse::<toml_edit::DocumentMut>().unwrap();
plan_section(
doc,
"kelpie",
&keys.iter().map(|key| key.to_string()).collect::<Vec<_>>(),
&value,
)
}
#[test]
fn a_key_under_an_inline_table_is_written_inline() {
let plan = inline_plan(&["worker", "timeout"], json!(45)).unwrap();
let Write::DogSection { toml, .. } = &plan.write else {
unreachable!()
};
assert!(toml.contains("worker = { timeout = 45"), "{toml}");
assert!(
!toml.contains("[worker]"),
"{toml}: an inline table does not become a header"
);
assert_eq!(plan.changes.len(), 1);
assert_eq!(plan.changes[0].key, "timeout");
assert_eq!(plan.changes[0].old, Some(json!(30)));
assert_eq!(plan.changes[0].new, Some(json!(45)));
let plan = inline_plan(&["worker", "retries"], json!(3)).unwrap();
let Write::DogSection { toml, .. } = &plan.write else {
unreachable!()
};
assert!(toml.contains("worker = {"), "{toml}");
assert!(toml.contains("retries = 3"), "{toml}");
assert_eq!(plan.changes[0].kind, ChangeKind::Added);
}
#[test]
fn a_key_under_a_nested_inline_table_is_written() {
let plan = inline_plan(&["fetch", "git", "merging"], json!("rebase")).unwrap();
let Write::DogSection { toml, .. } = &plan.write else {
unreachable!()
};
assert!(
toml.contains("fetch = { git = { merging = \"rebase\" } }"),
"{toml}"
);
assert_eq!(plan.changes[0].old, Some(json!("ff")));
let error =
inline_plan(&["worker", "timeout", "deep"], json!(1)).expect_err("an integer holds no key");
assert!(
error
.to_string()
.contains("`kelpie.worker.timeout` holds a value that is not a table"),
"{error}"
);
}