use super::*;
#[test]
#[serial_test::serial(real_fs)] fn inline_declarations_survive_a_mux_probe_writeback_and_restart_merge() {
let declared = BackendConfig {
name: "dgx1".into(),
endpoint: "http://dgx:8000".into(),
model: Some("bound-model".into()),
card: Some("team-reasoner".into()),
capability: Some(crate::model_card::Capability {
emits_leading_reasoning: Some(true),
..Default::default()
}),
..Default::default()
};
let home = tempfile::tempdir().unwrap();
let _env = ConfigDirGuard::set(home.path());
std::fs::write(home.path().join("config.toml"), "# cfg\n").unwrap();
let observation = ProbeObservation {
name: "dgx1".into(),
endpoint: "http://dgx:8000".into(),
kind: Some(BackendKind::Openai),
api: None,
serving: ProbedServing::Multiplexer,
};
assert!(matches!(
persist_probe_observation(&observation).expect("writeback runs"),
ProbeWriteback::Written(_)
));
let mut cfg = Config {
backends: vec![declared],
..Default::default()
};
merge_for_test(&mut cfg, &[&home.path().join("backends")]).unwrap();
let merged = &cfg.backends[0];
assert_eq!(merged.card.as_deref(), Some("team-reasoner"));
assert!(merged.capability.is_some());
assert_eq!(
merged.effective_model(),
Some("bound-model"),
"a mux writeback persists no model — the declaration stands"
);
assert_eq!(
merged.kind,
Some(BackendKind::Openai),
"observed kind applies"
);
assert_eq!(merged.serving, Some(Serving::Multiplexer));
}
#[test]
fn legacy_untagged_probe_stamped_model_fails_visibly() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("dgx1.toml"),
"endpoint = \"http://dgx:8000\"\nmodel = \"warm-pick\"\n\n[provenance]\nsource = \"newt adopt v0.7.9 (probed; delete this file to reset)\"\nprobed = \"2026-08-01\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![],
..Default::default()
};
let err =
merge_for_test(&mut cfg, &[dir.path()]).expect_err("the ambiguity must refuse to load");
assert!(err.contains("dgx1.toml"), "names the file: {err}");
assert!(
err.contains("operator_v1"),
"names the claim remediation: {err}"
);
assert!(
err.contains("delete"),
"offers the reset remediation: {err}"
);
}
#[test]
fn disk_backends_load_per_file_by_stem_and_override_inline() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("dgx1.toml"),
"endpoint = \"http://REDACTED-HOST:11434\"\nmodel = \"qwen3:30b\"\n",
)
.unwrap();
std::fs::write(dir.path().join("broken.toml"), "model = \"x\"\n").unwrap();
std::fs::write(dir.path().join("README.md"), "not a backend").unwrap();
let mut cfg = Config {
backends: vec![
BackendConfig {
name: "dgx1".into(),
endpoint: "http://stale:11434".into(),
model: Some("old-model".into()),
model_path: None,
tiers: vec![],
kind: Some(BackendKind::Ollama),
api: Default::default(),
api_key_file: None,
api_key_env: None,
..Default::default()
},
BackendConfig {
name: "gpu-runner".into(),
endpoint: "http://gpu-runner:11434".into(),
model: Some("qwen2.5-coder:14b".into()),
model_path: None,
tiers: vec![],
kind: Some(BackendKind::Ollama),
api: Default::default(),
api_key_file: None,
api_key_env: None,
..Default::default()
},
],
..Default::default()
};
merge_for_test(&mut cfg, &[dir.path()]).unwrap();
assert_eq!(cfg.backends.len(), 2, "only the valid .toml loads, no dup");
let dgx1 = cfg.backends.iter().find(|b| b.name == "dgx1").unwrap();
assert_eq!(dgx1.endpoint, "http://REDACTED-HOST:11434", "disk wins");
assert_eq!(dgx1.effective_model(), Some("qwen3:30b"));
assert_eq!(dgx1.kind, None, "absent kind means probe-at-connect");
assert!(
cfg.backends.iter().any(|b| b.name == "gpu-runner"),
"gpu-runner kept"
);
}
#[test]
fn probe_records_overlay_only_observed_fields_never_auth_or_tiers() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("gpt41.toml"),
"record = \"probe_v1\"\nendpoint = \"https://api.openai.com\"\nkind = \"openai\"\nserving = \"multiplexer\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "gpt41".into(),
endpoint: "https://api.openai.com".into(),
model: Some("gpt-4.1".into()),
api_key_env: Some("OPENAI_API_KEY".into()),
api_key_file: Some("/vault/openai".into()),
tiers: vec![Tier::Fast, Tier::Standard, Tier::Complex, Tier::Review],
..Default::default()
}],
..Default::default()
};
merge_for_test(&mut cfg, &[dir.path()]).unwrap();
let b = cfg.backends.iter().find(|b| b.name == "gpt41").unwrap();
assert_eq!(b.kind, Some(BackendKind::Openai), "observed kind overlaid");
assert_eq!(
b.serving,
Some(Serving::Multiplexer),
"observed serving overlaid"
);
assert_eq!(b.api_key_env.as_deref(), Some("OPENAI_API_KEY"));
assert_eq!(b.api_key_file.as_deref(), Some("/vault/openai"));
assert_eq!(
b.tiers,
vec![Tier::Fast, Tier::Standard, Tier::Complex, Tier::Review],
"tiers untouched"
);
assert_eq!(
b.effective_model(),
Some("gpt-4.1"),
"a mux record leaves the declared model standing"
);
}
#[test]
fn operator_record_omissions_clear_even_with_a_probe_timestamp() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("eval.toml"),
"record = \"operator_v1\"\nendpoint = \"http://router:8080\"\n\n[provenance]\nprobed = \"2026-08-01\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "eval".into(),
endpoint: "http://router:8080".into(),
model: Some("big-30b".into()),
card: Some("team-reasoner".into()),
api_key_env: Some("TOKEN".into()),
tiers: vec![Tier::Fast, Tier::Standard],
..Default::default()
}],
..Default::default()
};
merge_for_test(&mut cfg, &[dir.path()]).unwrap();
let b = cfg.backends.iter().find(|b| b.name == "eval").unwrap();
assert_eq!(b.model, None, "omitted model clears");
assert_eq!(
b.card, None,
"omitted card clears — rebinding stays possible"
);
assert_eq!(b.api_key_env, None, "omitted auth clears");
assert!(b.tiers.is_empty(), "omitted tiers clear");
}
#[test]
fn probe_record_with_a_different_endpoint_does_not_overlay() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("gpt41.toml"),
"record = \"probe_v1\"\nendpoint = \"http://other:9\"\nkind = \"ollama\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "gpt41".into(),
endpoint: "https://api.openai.com".into(),
kind: Some(BackendKind::Openai),
..Default::default()
}],
..Default::default()
};
merge_for_test(&mut cfg, &[dir.path()]).unwrap();
assert_eq!(
cfg.backends[0].kind,
Some(BackendKind::Openai),
"not overlaid"
);
}
#[test]
fn probe_record_for_an_unconfigured_backend_is_ignored() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("ghost.toml"),
"record = \"probe_v1\"\nendpoint = \"http://h:1\"\nkind = \"ollama\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![],
..Default::default()
};
merge_for_test(&mut cfg, &[dir.path()]).unwrap();
assert!(
cfg.backends.is_empty(),
"a probe OVERLAY cannot define a backend"
);
}
#[test]
fn probe_overlay_preserves_the_declared_binding_seed() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("dgx1.toml"),
"record = \"probe_v1\"\nendpoint = \"http://dgx:8000\"\nkind = \"openai\"\nserving = \"instance\"\nmodel = \"probed-b\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "dgx1".into(),
endpoint: "http://dgx:8000".into(),
model: Some("declared-a".into()),
card: Some("team-reasoner".into()),
..Default::default()
}],
..Default::default()
};
let receipts = merge_for_test(&mut cfg, &[dir.path()]).unwrap();
let b = cfg.backends.iter().find(|b| b.name == "dgx1").unwrap();
assert_eq!(
b.effective_model(),
Some("probed-b"),
"the live route adopts the probed instance model"
);
let receipt = &receipts[0];
assert_eq!(
receipt.declaration.model.as_deref(),
Some("declared-a"),
"the declaration layer never absorbs a probe result"
);
assert_eq!(
receipt.observation.as_ref().map(|o| &o.serving),
Some(&ProbedServing::Instance {
model: Some("probed-b".into())
}),
"the probed model is recorded as an OBSERVATION"
);
assert_eq!(receipt.binding.card.as_deref(), Some("team-reasoner"));
assert_eq!(
receipt.binding.bound_model.as_deref(),
Some("declared-a"),
"the binding evidence is the DECLARATION, not the probe result — \
deciding for principal `probed-b` is an exact mismatch (inactive)"
);
assert_eq!(
receipt.binding.bound_destination,
BackendDestination::new(Some("http://dgx:8000".into()), None)
);
}
#[test]
fn setup_written_untagged_files_stay_operator() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("lab.toml"),
"endpoint = \"http://lab:8000\"\nmodel = \"qwen3:30b\"\nkind = \"openai\"\n\n\
[provenance]\nsource = \"newt setup v0.7.9 (auto-detected Openai)\"\nprobed = \"2026-07-01\"\nderived_serving = true\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![],
..Default::default()
};
merge_for_test(&mut cfg, &[dir.path()]).unwrap();
assert_eq!(cfg.backends.len(), 1, "loads as an operator definition");
assert_eq!(cfg.backends[0].effective_model(), Some("qwen3:30b"));
}
#[test]
fn legacy_adopt_probe_cache_overlays_without_clearing_declarations() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("dgx1.toml"),
"endpoint = \"http://dgx:8000\"\nkind = \"openai\"\nserving = \"multiplexer\"\ntiers = []\n\n\
[provenance]\nsource = \"newt adopt v0.8.0 abcdef123456 (probed; delete this file to reset)\"\nprobed = \"2026-08-01\"\nderived_serving = true\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "dgx1".into(),
endpoint: "http://dgx:8000".into(),
model: Some("declared-a".into()),
card: Some("team-reasoner".into()),
api_key_env: Some("TOKEN".into()),
tiers: vec![Tier::Fast],
..Default::default()
}],
..Default::default()
};
merge_for_test(&mut cfg, &[dir.path()]).unwrap();
let b = &cfg.backends[0];
assert_eq!(b.card.as_deref(), Some("team-reasoner"), "card survives");
assert_eq!(b.api_key_env.as_deref(), Some("TOKEN"), "auth survives");
assert_eq!(b.tiers, vec![Tier::Fast], "tiers survive");
assert_eq!(b.effective_model(), Some("declared-a"), "model survives");
assert_eq!(b.kind, Some(BackendKind::Openai), "observed kind applies");
}
#[test]
fn legacy_adopt_hybrid_with_operator_fields_is_ambiguous() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("dgx1.toml"),
"endpoint = \"http://dgx:8000\"\nmodel = \"warm-pick\"\napi_key_env = \"TOKEN\"\n\n\
[provenance]\nsource = \"newt adopt v0.7.9 (probed; delete this file to reset)\"\nprobed = \"2026-08-01\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![],
..Default::default()
};
let err = merge_for_test(&mut cfg, &[dir.path()]).expect_err("hybrids refuse to load");
assert!(
err.contains("operator_v1") && err.contains("delete"),
"{err}"
);
}
#[test]
fn probe_record_smuggling_operator_fields_is_rejected() {
for body in [
"record = \"probe_v1\"\nendpoint = \"http://h:1\"\nkind = \"ollama\"\ncard = \"evil\"\n",
"record = \"probe_v1\"\nendpoint = \"http://h:1\"\nserving = \"multiplexer\"\nmodel = \"b\"\n",
"record = \"probe_v1\"\nkind = \"ollama\"\n",
] {
let dir = tempfile::tempdir().unwrap();
std::fs::write(dir.path().join("gpt41.toml"), body).unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "gpt41".into(),
endpoint: "http://h:1".into(),
kind: Some(BackendKind::Openai),
..Default::default()
}],
..Default::default()
};
merge_for_test(&mut cfg, &[dir.path()]).unwrap();
assert_eq!(
cfg.backends[0].kind,
Some(BackendKind::Openai),
"nothing overlays from an invalid probe record: {body}"
);
assert_eq!(cfg.backends[0].card, None);
}
}
#[test]
fn backend_identity_is_validated_on_normal_and_profile_paths() {
let dup = || {
vec![
BackendConfig {
name: "twin".into(),
endpoint: "http://a:1".into(),
model: Some("model-a".into()),
card: Some("card-a".into()),
..Default::default()
},
BackendConfig {
name: "twin".into(),
endpoint: "http://b:2".into(),
model: Some("model-b".into()),
card: Some("card-b".into()),
..Default::default()
},
]
};
let err = BackendAssembly::new(dup()).expect_err("duplicates refuse");
assert!(err.contains("twin") && err.contains("rename one"), "{err}");
let cfg = Config {
backends: dup(),
..Default::default()
};
let err = cfg.prepare_runtime().expect_err("profiles validate too");
assert!(err.to_string().contains("twin"), "{err}");
let err = BackendAssembly::new(vec![BackendConfig {
name: " ".into(),
endpoint: "http://a:1".into(),
..Default::default()
}])
.expect_err("empty names refuse");
assert!(err.contains("has no name"), "{err}");
}
#[test]
fn receipts_align_by_slot_and_selection_agrees() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
unsafe { std::env::remove_var("NEWT_PROVIDER") };
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("second.toml"),
"record = \"probe_v1\"\nendpoint = \"http://b:2\"\nkind = \"openai\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![
BackendConfig {
name: "first".into(),
endpoint: "http://a:1".into(),
..Default::default()
},
BackendConfig {
name: "second".into(),
endpoint: "http://b:2".into(),
..Default::default()
},
],
default_backend: Some("second".into()),
..Default::default()
};
let receipts = merge_for_test(&mut cfg, &[dir.path()]).unwrap();
assert_eq!(receipts.len(), cfg.backends.len(), "1:1 by construction");
assert!(receipts[0].observation.is_none());
assert!(
receipts[1].observation.is_some(),
"the probe attached to ITS slot"
);
let resolved = ResolvedConfig {
config: cfg,
receipts,
};
let rb = resolved.backend(1).expect("slot 1 exists");
assert_eq!(rb.slot, 1);
assert_eq!(rb.backend.name, "second");
assert!(rb.receipt.observation.is_some());
assert!(resolved.backend(2).is_none(), "out of range is None");
let zipped: Vec<(usize, &str)> = resolved
.backends()
.map(|rb| (rb.slot, rb.backend.name.as_str()))
.collect();
assert_eq!(zipped, vec![(0, "first"), (1, "second")]);
let picked = resolved.selected_backend().expect("default selects");
assert_eq!(picked.slot, 1);
assert_eq!(
resolved
.select_configured_backend()
.map(|b| b.name.as_str()),
Some("second"),
"same slot through the Config surface"
);
}
#[test]
fn a_skipped_operator_record_touches_nothing_and_a_valid_one_resets() {
let probe_dir = tempfile::tempdir().unwrap();
std::fs::write(
probe_dir.path().join("dgx1.toml"),
"record = \"probe_v1\"\nendpoint = \"http://dgx:8000\"\nserving = \"instance\"\nmodel = \"probed-b\"\n",
)
.unwrap();
let hollow_dir = tempfile::tempdir().unwrap();
std::fs::write(
hollow_dir.path().join("dgx1.toml"),
"record = \"operator_v1\"\nmodel = \"only-a-model\"\n",
)
.unwrap();
let declared = BackendConfig {
name: "dgx1".into(),
endpoint: "http://dgx:8000".into(),
model: Some("declared-a".into()),
card: Some("card-a".into()),
..Default::default()
};
let mut cfg = Config {
backends: vec![declared.clone()],
..Default::default()
};
let receipts = merge_for_test(&mut cfg, &[probe_dir.path(), hollow_dir.path()]).unwrap();
let receipt = &receipts[0];
assert_eq!(
receipt.declaration.model.as_deref(),
Some("declared-a"),
"the skipped operator record must not strip the declaration"
);
assert!(
receipt.observation.is_some(),
"…nor the earlier probe observation"
);
assert_eq!(receipt.binding.card.as_deref(), Some("card-a"));
let replace_dir = tempfile::tempdir().unwrap();
std::fs::write(
replace_dir.path().join("dgx1.toml"),
"record = \"operator_v1\"\nendpoint = \"http://new:9000\"\nmodel = \"fresh\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![declared],
..Default::default()
};
let receipts = merge_for_test(&mut cfg, &[probe_dir.path(), replace_dir.path()]).unwrap();
let receipt = &receipts[0];
assert_eq!(receipt.declaration.model.as_deref(), Some("fresh"));
assert_eq!(receipt.declaration.card, None, "reset — omissions clear");
assert!(
receipt.observation.is_none(),
"the observation was about the OLD declaration — reset with it"
);
}
#[test]
fn validate_then_publish_then_keep_the_receipt_view() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
let cfg = Config {
backends: vec![BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
card: Some("card-a".into()),
model: Some("model-a".into()),
..Default::default()
}],
..Default::default()
};
cfg.validate_backend_identities().expect("valid first");
let mut cfg = cfg;
let receipts = resolve_for_test(&mut cfg, &[], None).unwrap();
let resolved = ResolvedConfig {
config: cfg,
receipts,
};
resolved.publish_runtime_settings();
let picked = resolved.backend(0).expect("slot 0");
assert_eq!(picked.receipt.binding.card.as_deref(), Some("card-a"));
}
#[test]
fn a_home_probe_attaches_against_the_final_project_declaration() {
let home = tempfile::tempdir().unwrap();
std::fs::write(
home.path().join("roamer.toml"),
"record = \"probe_v1\"\nendpoint = \"http://e:8000\"\nkind = \"ollama\"\n",
)
.unwrap();
let project = tempfile::tempdir().unwrap();
std::fs::write(
project.path().join("roamer.toml"),
"record = \"operator_v1\"\nendpoint = \"http://e:8000\"\nmodel = \"declared\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![],
..Default::default()
};
let receipts = merge_for_test(&mut cfg, &[home.path(), project.path()]).unwrap();
assert!(
receipts[0].observation.is_some(),
"the home probe reached the project declaration"
);
assert_eq!(cfg.backends[0].kind, Some(BackendKind::Ollama));
assert_eq!(cfg.backends[0].effective_model(), Some("declared"));
let moved = tempfile::tempdir().unwrap();
std::fs::write(
moved.path().join("roamer.toml"),
"record = \"operator_v1\"\nendpoint = \"http://elsewhere:9\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![],
..Default::default()
};
let receipts = merge_for_test(&mut cfg, &[home.path(), moved.path()]).unwrap();
assert!(
receipts[0].observation.is_none(),
"a probe of E never attaches to a declaration at E2"
);
assert_eq!(cfg.backends[0].kind, None);
let project_probe = tempfile::tempdir().unwrap();
std::fs::write(
project_probe.path().join("roamer.toml"),
"record = \"probe_v1\"\nendpoint = \"http://e:8000\"\nkind = \"openai\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "roamer".into(),
endpoint: "http://e:8000".into(),
..Default::default()
}],
..Default::default()
};
let receipts = merge_for_test(&mut cfg, &[home.path(), project_probe.path()]).unwrap();
assert_eq!(
receipts[0].observation.as_ref().and_then(|o| o.kind),
Some(BackendKind::Openai),
"deterministic last-wins probe precedence"
);
}
#[test]
fn an_empty_model_path_dropin_cannot_replace_a_declaration() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("keep.toml"),
"record = \"operator_v1\"\nmodel_path = \"\"\nmodel = \"stripper\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "keep".into(),
endpoint: "http://old:1".into(),
model: Some("declared".into()),
..Default::default()
}],
..Default::default()
};
let (_receipts, warnings) = merge_for_test_with_warnings(&mut cfg, &[dir.path()]).unwrap();
assert!(
warnings
.iter()
.any(|w| w.contains("neither endpoint nor model_path")),
"{warnings:?}"
);
assert_eq!(cfg.backends[0].endpoint, "http://old:1");
assert_eq!(cfg.backends[0].model.as_deref(), Some("declared"));
}
#[test]
fn stale_probe_warning_logs_once_across_many_reloads() {
reset_emitted_warnings_for_test();
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("ghost.toml"),
"record = \"probe_v1\"\nendpoint = \"http://h:1\"\nkind = \"ollama\"\n",
)
.unwrap();
let expected = format!(
"{}: probe record names an unconfigured backend — ignored (delete the file)",
dir.path().join("ghost.toml").display()
);
for i in 0..14 {
let mut cfg = Config::default();
let (_receipts, warnings) =
resolve_for_test_with_warnings(&mut cfg, &[dir.path()], None).unwrap();
assert!(
warnings.contains(&expected),
"load {i}: every call's own warnings() must still report the miss: {warnings:?}"
);
}
assert!(
!first_emission_this_process(&expected),
"the 14 loads above must have already logged this warning once"
);
}
#[test]
#[serial_test::serial(real_fs)] fn an_incoherent_model_path_declaration_normalizes_with_and_without_an_edit() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
unsafe { std::env::remove_var("NEWT_PROVIDER") };
let base = || Config {
backends: vec![BackendConfig {
name: "weird".into(),
model_path: Some("/m.gguf".into()),
kind: Some(BackendKind::Openai),
..Default::default()
}],
..Default::default()
};
let mut cfg = base();
resolve_for_test(&mut cfg, &[], None).unwrap();
assert_eq!(cfg.backends[0].kind, Some(BackendKind::Embedded));
let mut cfg = base();
let receipts = resolve_for_test(
&mut cfg,
&[],
Some(BackendOverride {
model: Some("m".into()),
..Default::default()
}),
)
.expect("the preview normalizes exactly as composition does");
assert!(receipts[0].request.is_some());
assert_eq!(cfg.backends[0].kind, Some(BackendKind::Embedded));
assert_eq!(cfg.backends[0].model.as_deref(), Some("m"));
}
#[test]
fn empty_model_strings_never_become_receipt_identity() {
let mut cfg = Config {
backends: vec![BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
model: Some("".into()),
card: Some("card-a".into()),
..Default::default()
}],
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], None).unwrap();
assert_eq!(receipts[0].declaration.model, None, "effective-model rule");
assert_eq!(receipts[0].binding.bound_model, None);
}