use super::{PLACE, decode_file};
use crate::boundary::config::ConfigFile;
use serde_json::{Value, json};
fn destinations() -> Vec<(&'static str, Value, Vec<&'static str>)> {
vec![
(
"brazen",
json!({ "file": "brazen", "workspace": "ws" }),
vec!["workspace"],
),
("litany-models", json!({ "file": "litany-models" }), vec![]),
(
"litany-workflow",
json!({ "file": "litany-workflow", "name": "review" }),
vec!["name"],
),
("cadence", json!({ "file": "cadence" }), vec![]),
(
"branch",
json!({ "file": "branch", "workspace": "ws", "lineage": "default",
"origin": "fork", "source": "base", "path": "providers.yaml" }),
vec!["workspace", "lineage", "path", "origin", "source"],
),
]
}
#[test]
fn every_destination_reads_when_its_parameters_are_present() {
for (file, whole, _) in destinations() {
assert!(decode_file(&whole).is_ok(), "{file}: {whole}");
}
}
#[test]
fn a_workspace_beside_target_instead_of_inside_it_is_told_where_it_belongs() {
let err = decode_file(&json!({ "file": "brazen" })).unwrap_err();
assert_eq!(
err,
"config: target for file \"brazen\": missing or non-string field \
\"workspace\" — the config family carries its parameters INSIDE target"
);
}
#[test]
fn every_destination_parameter_refuses_by_place_as_well_as_by_name() {
for (file, whole, keys) in destinations() {
for key in keys {
for broken in [None, Some(json!(7))] {
let mut obj = whole.as_object().cloned().unwrap_or_default();
match broken {
None => obj.remove(key),
Some(v) => obj.insert(key.to_owned(), v),
};
let err = decode_file(&Value::Object(obj)).unwrap_err();
assert!(err.contains(&format!("file {file:?}")), "{key}: {err}");
assert!(err.contains(&format!("field {key:?}")), "{key}: {err}");
assert!(err.ends_with(PLACE), "{key}: {err}");
}
}
}
}
#[test]
fn the_targets_own_refusals_are_unchanged() {
assert_eq!(
decode_file(&json!("brazen")).unwrap_err(),
"config: target is not an object"
);
assert_eq!(
decode_file(&json!({ "file": "enhance" })).unwrap_err(),
"config: unknown target file \"enhance\""
);
let branch = json!({ "file": "branch", "workspace": "ws", "lineage": "d",
"origin": "rebase", "path": "p" });
assert_eq!(
decode_file(&branch).unwrap_err(),
"config: unknown origin \"rebase\""
);
}
#[test]
fn a_target_naming_no_file_refuses_by_the_bare_field() {
let err = decode_file(&json!({ "workspace": "ws" })).unwrap_err();
assert_eq!(err, "missing or non-string field \"file\"");
}
#[test]
fn the_modes_that_take_no_source_read_without_one() {
for origin in ["advance", "orphan"] {
let v = json!({ "file": "branch", "workspace": "ws", "lineage": "d",
"origin": origin, "path": "p" });
assert!(
matches!(decode_file(&v), Ok(ConfigFile::Branch { .. })),
"{v}"
);
}
}