crates/nornir-build-thing/tests/cargo_features.rs
//! The operator's cargo feature choice reaches cargo exactly as given.
use nornir_build_thing::suite_cli::parse;
use nornir_build_thing::{BuildVariant, BuildVariantSet, CargoFeatures};
#[test]
fn the_build_verb_parses_features_and_both_flags() {
let a = parse(&["--variant", "app", "--features", "a, b", "--features=c,a", "--no-default-features", "--all-features"]).unwrap();
assert_eq!(a.cargo.features, ["a", "b", "c"], "comma lists split, repeats dropped, order kept");
assert!(a.cargo.no_default_features && a.cargo.all_features);
assert!(parse(&["--features"]).is_err(), "a bare --features is refused");
assert!(parse(&["--variant", "app"]).unwrap().cargo.is_empty());
}
#[test]
fn a_choice_lands_on_top_of_the_declared_variant_and_in_the_cargo_argv() {
let v = BuildVariant { name: "app".into(), package: Some("app".into()), features: vec!["declared".into()], ..Default::default() };
let mut cf = CargoFeatures::default();
cf.add_features(["extra", "declared"]);
cf.no_default_features = true;
cf.all_features = true;
let built = v.with_cargo_features(&cf);
let args = built.cargo_args();
let at = args.iter().position(|a| a == "--features").expect("--features");
assert_eq!(args[at + 1], "declared,extra");
assert!(args.iter().any(|a| a == "--no-default-features") && args.iter().any(|a| a == "--all-features"), "{args:?}");
assert_eq!(cf.argv(), ["--features", "extra,declared", "--no-default-features", "--all-features"]);
// a picked OPEN feature is decided: no longer a switch (the set validates)
let open = BuildVariant { name: "app".into(), open: ["extra".to_string()].into(), ..Default::default() };
let picked = open.with_cargo_features(&cf);
assert!(picked.open.is_empty() && picked.features.contains(&"extra".to_string()));
// an empty choice is the variant as declared
assert_eq!(v.with_cargo_features(&CargoFeatures::default()).cargo_args(), v.cargo_args());
}
#[test]
fn a_choice_for_no_cargo_variant_is_refused_by_name() {
let set = BuildVariantSet { variants: vec![BuildVariant { name: "app".into(), ..Default::default() }], ..Default::default() };
let mut cf = CargoFeatures::default();
cf.add_features(["extra"]);
let s = set.with_cargo_features("app", &cf).unwrap();
assert_eq!(s.get("app").unwrap().features, ["extra"]);
let e = set.with_cargo_features("nope", &cf).unwrap_err().to_string();
assert!(e.contains("'nope'") && e.contains("--features extra"), "{e}");
assert!(set.with_cargo_features("nope", &CargoFeatures::default()).is_ok(), "nothing chosen: nothing to refuse");
}