use super::*;
#[test]
fn cli_backend_override_with_endpoint_is_exclusive_and_defaults_tiers() {
let mut cfg = Config {
backends: vec![
BackendConfig {
name: "discovered-ollama".into(),
endpoint: "http://localhost:11434".into(),
kind: Some(BackendKind::Ollama),
tiers: vec![Tier::Fast, Tier::Standard, Tier::Complex, Tier::Review],
..Default::default()
},
fallback_localhost_backend(),
],
..Default::default()
};
let over = BackendOverride {
endpoint: Some("http://router:8080".into()),
model: Some("big-30b".into()),
kind: Some(BackendKind::Openai),
..Default::default()
};
over.apply(&mut cfg);
assert_eq!(cfg.backends.len(), 1, "CLI endpoint is exclusive");
let b = &cfg.backends[0];
assert_eq!(b.name, "cli");
assert_eq!(b.endpoint, "http://router:8080");
assert_eq!(b.model.as_deref(), Some("big-30b"));
assert_eq!(b.kind, Some(BackendKind::Openai));
assert_eq!(
b.tiers,
vec![Tier::Fast, Tier::Standard, Tier::Complex, Tier::Review],
"an exclusive CLI backend defaults to all tiers so it serves"
);
}
#[test]
fn cli_backend_override_field_only_edits_first_backend_in_place() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
crate::process_env::remove_var("NEWT_PROVIDER");
let mut cfg = Config {
backends: vec![BackendConfig {
name: "eval".into(),
endpoint: "http://router:8080".into(),
model: Some("old".into()),
kind: Some(BackendKind::Openai),
tiers: vec![Tier::Fast],
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
model: Some("new-model".into()),
..Default::default()
};
over.apply(&mut cfg);
assert_eq!(cfg.backends.len(), 1, "no new backend added");
assert_eq!(cfg.backends[0].name, "eval", "existing backend kept");
assert_eq!(cfg.backends[0].endpoint, "http://router:8080");
assert_eq!(cfg.backends[0].model.as_deref(), Some("new-model"));
}
#[test]
fn cli_backend_override_empty_is_a_noop() {
let mut cfg = Config {
backends: vec![fallback_localhost_backend()],
..Default::default()
};
let before: Vec<(String, String)> = cfg
.backends
.iter()
.map(|b| (b.name.clone(), b.endpoint.clone()))
.collect();
BackendOverride::default().apply(&mut cfg);
let after: Vec<(String, String)> = cfg
.backends
.iter()
.map(|b| (b.name.clone(), b.endpoint.clone()))
.collect();
assert_eq!(after, before, "an empty override changes nothing");
}
#[test]
fn a_requested_destination_change_clears_the_cached_observation() {
for e2 in ["http://e2:9000", "http://dgx:8000/"] {
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("card-a".into()),
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
name: Some("dgx1".into()),
endpoint: Some(e2.into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[dir.path()], Some(over)).unwrap();
let receipt = &receipts[0];
assert!(
receipt.observation.is_none(),
"`{e2}`: cached E1 observation must not ride to a new destination"
);
let b = &cfg.backends[0];
assert_eq!(b.endpoint, e2);
assert_eq!(b.kind, None, "`{e2}`: no probed kind leaks");
assert_eq!(b.serving, None, "`{e2}`: no probed serving leaks");
assert_eq!(
b.model.as_deref(),
Some("declared-a"),
"`{e2}`: the declaration, never the probed model"
);
assert_eq!(
receipt.binding.card.as_deref(),
Some("card-a"),
"`{e2}`: binding evidence preserved, not erased"
);
assert_eq!(
receipt.binding.bound_destination,
BackendDestination::new(Some("http://dgx:8000".into()), None),
"`{e2}`: still bound at the DECLARED destination"
);
}
}
#[test]
fn an_identical_requested_destination_retains_the_observation() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("dgx1.toml"),
"record = \"probe_v1\"\nendpoint = \"http://dgx:8000\"\nkind = \"openai\"\nserving = \"multiplexer\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "dgx1".into(),
endpoint: "http://dgx:8000".into(),
model: Some("declared-a".into()),
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
name: Some("dgx1".into()),
endpoint: Some("http://dgx:8000".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[dir.path()], Some(over)).unwrap();
assert!(
receipts[0].observation.is_some(),
"same destination retains"
);
assert_eq!(cfg.backends[0].kind, Some(BackendKind::Openai));
assert_eq!(cfg.backends[0].serving, Some(Serving::Multiplexer));
}
#[test]
fn a_model_only_request_retains_the_declared_binding() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
unsafe { std::env::remove_var("NEWT_PROVIDER") };
let mut cfg = Config {
backends: vec![BackendConfig {
name: "dgx1".into(),
endpoint: "http://dgx:8000".into(),
model: Some("declared-a".into()),
card: Some("card-a".into()),
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
model: Some("requested-b".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
let receipt = &receipts[0];
assert_eq!(cfg.backends[0].model.as_deref(), Some("requested-b"));
let request = receipt.request.as_ref().expect("recorded as a request");
assert_eq!(request.mode, RequestMode::FieldOnly);
assert_eq!(request.model.as_deref(), Some("requested-b"));
assert_eq!(
receipt.declaration.model.as_deref(),
Some("declared-a"),
"the request never masquerades as declaration"
);
assert_eq!(receipt.binding.card.as_deref(), Some("card-a"));
assert_eq!(receipt.binding.bound_model.as_deref(), Some("declared-a"));
}
#[test]
fn a_card_only_request_binds_to_the_declared_model_never_the_probed_one() {
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("dgx1.toml"),
"record = \"probe_v1\"\nendpoint = \"http://dgx:8000\"\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("card-a".into()),
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
card: Some("card-c".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[dir.path()], Some(over)).unwrap();
let receipt = &receipts[0];
assert_eq!(
cfg.backends[0].model.as_deref(),
Some("probed-b"),
"the route still adopts the cached instance model"
);
assert_eq!(receipt.binding.card.as_deref(), Some("card-c"));
assert_eq!(
receipt.binding.bound_model.as_deref(),
Some("declared-a"),
"an explicit rebind binds to requested-or-DECLARED, never probed"
);
}
#[test]
fn an_explicit_card_and_destination_request_rebinds_at_the_new_destination() {
let base = || Config {
backends: vec![BackendConfig {
name: "dgx1".into(),
endpoint: "http://dgx:8000".into(),
model: Some("declared-a".into()),
card: Some("card-a".into()),
..Default::default()
}],
..Default::default()
};
let e2 = BackendDestination::new(Some("http://e2:9000".into()), None);
let mut cfg = base();
let over = BackendOverride {
name: Some("dgx1".into()),
endpoint: Some("http://e2:9000".into()),
model: Some("requested-m".into()),
card: Some("card-c".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
let binding = &receipts[0].binding;
assert_eq!(binding.card.as_deref(), Some("card-c"));
assert_eq!(binding.bound_model.as_deref(), Some("requested-m"));
assert_eq!(binding.bound_destination, e2);
let mut cfg = base();
let over = BackendOverride {
name: Some("dgx1".into()),
endpoint: Some("http://e2:9000".into()),
card: Some("card-c".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
let binding = &receipts[0].binding;
assert_eq!(binding.bound_model.as_deref(), Some("declared-a"));
assert_eq!(binding.bound_destination, e2);
}
#[test]
fn an_exclusive_destination_request_keeps_one_chosen_slot() {
let backends = || {
vec![
BackendConfig {
name: "first".into(),
endpoint: "http://a:1".into(),
..Default::default()
},
BackendConfig {
name: "second".into(),
endpoint: "http://b:2".into(),
model: Some("declared-b".into()),
..Default::default()
},
]
};
let mut cfg = Config {
backends: backends(),
..Default::default()
};
let over = BackendOverride {
name: Some("second".into()),
endpoint: Some("http://new:9".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
assert_eq!(cfg.backends.len(), 1);
assert_eq!(receipts.len(), 1, "receipts stay 1:1");
assert_eq!(cfg.backends[0].name, "second");
assert_eq!(
receipts[0].declaration.model.as_deref(),
Some("declared-b"),
"the chosen slot's declaration layer survives"
);
let mut cfg = Config {
backends: backends(),
..Default::default()
};
let over = BackendOverride {
endpoint: Some("http://new:9".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
assert_eq!(cfg.backends.len(), 1);
assert_eq!(cfg.backends[0].name, "cli");
assert_eq!(receipts[0].declaration, DeclaredBackend::default());
assert_eq!(
receipts[0].request.as_ref().map(|r| r.mode),
Some(RequestMode::ExclusiveDestination)
);
}
#[test]
fn a_destination_request_is_exactly_one_nonempty_destination() {
let base = || Config {
backends: vec![BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
..Default::default()
}],
..Default::default()
};
for (what, over) in [
(
"both destinations",
BackendOverride {
endpoint: Some("http://h:1".into()),
model_path: Some("/m.gguf".into()),
..Default::default()
},
),
(
"empty endpoint",
BackendOverride {
endpoint: Some(String::new()),
..Default::default()
},
),
(
"empty model_path",
BackendOverride {
model_path: Some(String::new()),
..Default::default()
},
),
] {
let mut cfg = base();
let err = resolve_for_test(&mut cfg, &[], Some(over)).expect_err(what);
assert!(err.contains("--backend-"), "{what}: {err}");
}
}
#[test]
fn a_destination_retarget_replaces_the_destination_axis_whole() {
let mut cfg = Config {
backends: vec![BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
model: Some("declared".into()),
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
name: Some("a".into()),
model_path: Some("/models/x.gguf".into()),
card: Some("card-x".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
let b = &cfg.backends[0];
assert_eq!(b.endpoint, "", "HTTP endpoint cleared by embedded retarget");
assert_eq!(b.model_path.as_deref(), Some("/models/x.gguf"));
let flat = BackendDestination::of(b);
let receipt = &receipts[0];
let requested = receipt
.request
.as_ref()
.unwrap()
.destination_over(&receipt.declaration.destination);
assert_eq!(flat, requested, "flattened == requested destination");
assert_eq!(
receipt.binding.bound_destination, requested,
"explicit card rebind binds AT the requested destination"
);
let mut cfg = Config {
backends: vec![BackendConfig {
name: "emb".into(),
model_path: Some("/models/x.gguf".into()),
..Default::default()
}],
..Default::default()
};
BackendOverride {
name: Some("emb".into()),
endpoint: Some("http://h:1".into()),
..Default::default()
}
.apply(&mut cfg);
let b = &cfg.backends[0];
assert_eq!(b.endpoint, "http://h:1");
assert_eq!(b.model_path, None, "embedded path cleared by HTTP retarget");
}
#[test]
fn a_named_field_only_request_missing_its_slot_is_a_hard_error() {
let mut cfg = Config {
backends: vec![BackendConfig {
name: "real".into(),
endpoint: "http://a:1".into(),
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
name: Some("ghost".into()),
model: Some("m".into()),
..Default::default()
};
let err = resolve_for_test(&mut cfg, &[], Some(over)).expect_err("no fallback");
assert!(
err.contains("ghost") && err.contains("real"),
"names the miss and the configured set: {err}"
);
}
#[test]
#[serial_test::serial(real_fs)] fn an_unnamed_field_only_request_targets_the_selected_slot_not_index_zero() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
let base = || Config {
backends: vec![
BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
model: Some("model-a".into()),
..Default::default()
},
BackendConfig {
name: "b".into(),
endpoint: "http://b:2".into(),
model: Some("model-b".into()),
..Default::default()
},
],
default_backend: Some("b".into()),
..Default::default()
};
unsafe { std::env::remove_var("NEWT_PROVIDER") };
let mut cfg = base();
let over = BackendOverride {
model: Some("new-model".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over.clone())).unwrap();
assert_eq!(
cfg.backends[0].model.as_deref(),
Some("model-a"),
"a untouched"
);
assert_eq!(
cfg.backends[1].model.as_deref(),
Some("new-model"),
"b edited"
);
assert!(receipts[0].request.is_none());
assert!(
receipts[1].request.is_some(),
"receipt on the SELECTED slot"
);
unsafe { std::env::set_var("NEWT_PROVIDER", "a") };
let mut cfg = base();
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
assert_eq!(
cfg.backends[0].model.as_deref(),
Some("new-model"),
"a edited"
);
assert_eq!(
cfg.backends[1].model.as_deref(),
Some("model-b"),
"b untouched"
);
assert!(receipts[0].request.is_some());
}
#[test]
#[serial_test::serial(real_fs)] fn a_named_request_edits_and_selects_the_named_backend() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
unsafe { std::env::set_var("NEWT_PROVIDER", "b") };
let mut cfg = Config {
backends: vec![
BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
..Default::default()
},
BackendConfig {
name: "b".into(),
endpoint: "http://b:2".into(),
model: Some("model-b".into()),
..Default::default()
},
],
default_backend: Some("a".into()),
..Default::default()
};
let over = BackendOverride {
name: Some("b".into()),
model: Some("new-model".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
assert_eq!(cfg.backends[1].model.as_deref(), Some("new-model"));
assert!(
receipts[1].request.is_some(),
"receipt aligned with the edit"
);
let resolved = ResolvedConfig {
config: cfg,
receipts,
};
let picked = resolved.selected_backend().expect("named selection");
assert_eq!(picked.slot, 1, "name-only selection beats the default");
assert_eq!(picked.backend.model.as_deref(), Some("new-model"));
assert!(picked.receipt.request.is_some());
}
#[test]
#[serial_test::serial(real_fs)] fn an_unnamed_field_only_request_cannot_edit_an_unroutable_selected_slot() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
let base = || Config {
backends: vec![
BackendConfig {
name: "routable".into(),
endpoint: "http://a:1".into(),
..Default::default()
},
BackendConfig {
name: "hollow".into(),
..Default::default()
},
],
..Default::default()
};
let model_only = BackendOverride {
model: Some("m".into()),
..Default::default()
};
unsafe { std::env::set_var("NEWT_PROVIDER", "hollow") };
let mut cfg = base();
let err = resolve_for_test(&mut cfg, &[], Some(model_only.clone()))
.expect_err("no silent edit of an unroutable selection");
assert!(
err.contains("hollow") && err.contains("--backend-url"),
"names the slot and the remediation: {err}"
);
unsafe { std::env::remove_var("NEWT_PROVIDER") };
let mut cfg = Config {
default_backend: Some("hollow".into()),
..base()
};
let err = resolve_for_test(&mut cfg, &[], Some(model_only))
.expect_err("default-selected unroutable slot refuses the edit");
assert!(err.contains("hollow"), "{err}");
let mut cfg = Config {
default_backend: Some("hollow".into()),
..base()
};
let over = BackendOverride {
name: Some("hollow".into()),
endpoint: Some("http://now-routable:9".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
assert_eq!(cfg.backends.len(), 1);
assert_eq!(cfg.backends[0].endpoint, "http://now-routable:9");
assert_eq!(
receipts[0].request.as_ref().map(|r| r.mode),
Some(RequestMode::ExclusiveDestination)
);
}
#[test]
fn destination_kind_coherence_is_enforced_in_composition() {
let mut cfg = Config {
backends: vec![BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
kind: Some(BackendKind::Openai),
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
name: Some("a".into()),
model_path: Some("/models/x.gguf".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
let b = &cfg.backends[0];
assert_eq!(
b.kind,
Some(BackendKind::Embedded),
"model_path route IS embedded"
);
assert_eq!(b.endpoint, "");
let requested = receipts[0]
.request
.as_ref()
.unwrap()
.destination_over(&receipts[0].declaration.destination);
assert_eq!(
requested,
BackendDestination::new(None, Some("/models/x.gguf".into()))
);
assert_eq!(BackendDestination::of(b), requested);
let mut cfg = Config {
backends: vec![],
..Default::default()
};
let over = BackendOverride {
model_path: Some("/models/y.gguf".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
assert_eq!(cfg.backends[0].kind, Some(BackendKind::Embedded));
assert_eq!(
receipts[0]
.request
.as_ref()
.unwrap()
.destination_over(&receipts[0].declaration.destination),
BackendDestination::new(None, Some("/models/y.gguf".into()))
);
let mut cfg = Config {
backends: vec![BackendConfig {
name: "emb".into(),
model_path: Some("/models/x.gguf".into()),
kind: Some(BackendKind::Embedded),
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
name: Some("emb".into()),
endpoint: Some("http://h:1".into()),
..Default::default()
};
let receipts = resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
let b = &cfg.backends[0];
assert_eq!(b.endpoint, "http://h:1");
assert_eq!(b.model_path, None);
assert_eq!(
b.kind, None,
"an endpoint route never retains Embedded — cleared to probe-at-connect"
);
assert_eq!(
BackendDestination::of(b),
receipts[0]
.request
.as_ref()
.unwrap()
.destination_over(&receipts[0].declaration.destination)
);
}
#[test]
fn contradictory_destination_kind_pairs_are_refused() {
let base = || Config {
backends: vec![BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
..Default::default()
}],
..Default::default()
};
let mut cfg = base();
let err = resolve_for_test(
&mut cfg,
&[],
Some(BackendOverride {
endpoint: Some("http://h:1".into()),
kind: Some(BackendKind::Embedded),
..Default::default()
}),
)
.expect_err("url + embedded kind");
assert!(err.contains("contradictory"), "{err}");
let mut cfg = base();
let err = resolve_for_test(
&mut cfg,
&[],
Some(BackendOverride {
model_path: Some("/m.gguf".into()),
kind: Some(BackendKind::Openai),
..Default::default()
}),
)
.expect_err("model_path + HTTP kind");
assert!(err.contains("contradictory"), "{err}");
assert!(!backend_is_routable(&BackendConfig {
name: "weird".into(),
model_path: Some("/m.gguf".into()),
kind: Some(BackendKind::Openai),
..Default::default()
}));
assert!(backend_is_routable(&BackendConfig {
name: "emb".into(),
model_path: Some("/m.gguf".into()),
kind: Some(BackendKind::Embedded),
..Default::default()
}));
}
#[test]
#[serial_test::serial(real_fs)] fn backend_override_apply_delegates_to_the_invariant_owning_path() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
unsafe { std::env::remove_var("NEWT_PROVIDER") };
let base = || Config {
backends: vec![
BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
model: Some("model-a".into()),
..Default::default()
},
BackendConfig {
name: "b".into(),
endpoint: "http://b:2".into(),
model: Some("model-b".into()),
..Default::default()
},
],
default_backend: Some("b".into()),
..Default::default()
};
let snap = |cfg: &Config| -> Vec<String> {
cfg.backends
.iter()
.map(|b| toml::to_string(b).unwrap())
.collect()
};
let untouched = snap(&base());
for over in [
BackendOverride {
endpoint: Some("http://h:1".into()),
model_path: Some("/m.gguf".into()),
..Default::default()
},
BackendOverride {
endpoint: Some(String::new()),
..Default::default()
},
] {
let mut cfg = base();
assert!(over.try_apply(&mut cfg).is_err());
assert_eq!(snap(&cfg), untouched, "refusal leaves it untouched");
let mut cfg = base();
over.apply(&mut cfg); assert_eq!(snap(&cfg), untouched);
}
let mut cfg = base();
BackendOverride {
model: Some("new".into()),
..Default::default()
}
.apply(&mut cfg);
assert_eq!(cfg.backends[0].model.as_deref(), Some("model-a"));
assert_eq!(cfg.backends[1].model.as_deref(), Some("new"));
let mut cfg = base();
let over = BackendOverride {
name: Some("ghost".into()),
model: Some("m".into()),
..Default::default()
};
let err = over.try_apply(&mut cfg).expect_err("named miss");
assert!(err.contains("ghost"), "{err}");
assert_eq!(snap(&cfg), untouched);
let mut cfg = Config {
backends: vec![BackendConfig {
name: "emb".into(),
model_path: Some("/m.gguf".into()),
kind: Some(BackendKind::Embedded),
..Default::default()
}],
..Default::default()
};
BackendOverride {
name: Some("emb".into()),
endpoint: Some("http://h:1".into()),
..Default::default()
}
.apply(&mut cfg);
assert_eq!(
cfg.backends[0].kind, None,
"Embedded cleared on an HTTP route"
);
assert_eq!(cfg.backends[0].model_path, None);
}
#[test]
fn a_named_field_only_request_must_target_a_routable_backend() {
let base = || Config {
backends: vec![
BackendConfig {
name: "real".into(),
endpoint: "http://r:1".into(),
..Default::default()
},
BackendConfig {
name: "hollow".into(),
..Default::default()
},
],
..Default::default()
};
for over in [
BackendOverride {
name: Some("hollow".into()),
model: Some("m".into()),
..Default::default()
},
BackendOverride {
name: Some("hollow".into()),
..Default::default()
},
] {
let mut cfg = base();
let err = resolve_for_test(&mut cfg, &[], Some(over.clone()))
.expect_err("a named unroutable target refuses the edit");
assert!(
err.contains("hollow") && err.contains("--backend-url"),
"{err}"
);
let mut cfg = base();
let err = over
.try_apply(&mut cfg)
.expect_err("same through try_apply");
assert!(err.contains("hollow"), "{err}");
}
}
#[test]
fn a_both_destination_declaration_is_rejected_everywhere() {
let both = BackendConfig {
name: "twoplace".into(),
endpoint: "http://h:1".into(),
model_path: Some("/m.gguf".into()),
..Default::default()
};
let mut cfg = Config {
backends: vec![both.clone()],
..Default::default()
};
let err = resolve_for_test(&mut cfg, &[], None).expect_err("inline both");
assert!(err.contains("ONE destination"), "{err}");
let err = Config {
backends: vec![both],
..Default::default()
}
.prepare_runtime()
.expect_err("profile path validates too");
assert!(err.to_string().contains("ONE destination"), "{err}");
let dir = tempfile::tempdir().unwrap();
std::fs::write(
dir.path().join("keep.toml"),
"record = \"operator_v1\"\nendpoint = \"http://new:9\"\nmodel_path = \"/m.gguf\"\n",
)
.unwrap();
let mut cfg = Config {
backends: vec![BackendConfig {
name: "keep".into(),
endpoint: "http://old:1".into(),
..Default::default()
}],
..Default::default()
};
let (_receipts, warnings) = merge_for_test_with_warnings(&mut cfg, &[dir.path()]).unwrap();
let warnings = warnings.join("\n");
assert!(warnings.contains("ONE destination"), "{warnings}");
assert_eq!(cfg.backends[0].endpoint, "http://old:1", "prior survives");
}
#[test]
fn kind_only_field_requests_must_match_the_targets_destination() {
let http = || Config {
backends: vec![BackendConfig {
name: "http".into(),
endpoint: "http://h:1".into(),
..Default::default()
}],
..Default::default()
};
let emb = || Config {
backends: vec![BackendConfig {
name: "emb".into(),
model_path: Some("/m.gguf".into()),
kind: Some(BackendKind::Embedded),
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
name: Some("http".into()),
kind: Some(BackendKind::Embedded),
..Default::default()
};
let mut cfg = http();
let err = resolve_for_test(&mut cfg, &[], Some(over.clone())).expect_err("refuse");
assert!(err.contains("contradictory"), "{err}");
let mut cfg = http();
assert!(over.try_apply(&mut cfg).is_err());
assert_eq!(cfg.backends[0].kind, None, "untouched");
let over = BackendOverride {
name: Some("emb".into()),
kind: Some(BackendKind::Openai),
..Default::default()
};
let mut cfg = emb();
let err = resolve_for_test(&mut cfg, &[], Some(over)).expect_err("refuse");
assert!(err.contains("contradictory"), "{err}");
let over = BackendOverride {
name: Some("emb".into()),
kind: Some(BackendKind::Embedded),
..Default::default()
};
let mut cfg = emb();
resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
assert_eq!(cfg.backends[0].kind, Some(BackendKind::Embedded));
}
#[test]
fn a_field_only_edit_never_invents_tiers() {
let base = || Config {
backends: vec![BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
tiers: vec![],
..Default::default()
}],
..Default::default()
};
let over = BackendOverride {
name: Some("a".into()),
model: Some("m".into()),
..Default::default()
};
let mut cfg = base();
resolve_for_test(&mut cfg, &[], Some(over.clone())).unwrap();
assert!(cfg.backends[0].tiers.is_empty(), "assembly path");
let mut cfg = base();
over.try_apply(&mut cfg).unwrap();
assert!(cfg.backends[0].tiers.is_empty(), "public composer path");
let mut cfg = base();
BackendOverride {
name: Some("a".into()),
endpoint: Some("http://new:9".into()),
..Default::default()
}
.try_apply(&mut cfg)
.unwrap();
assert_eq!(cfg.backends[0].tiers.len(), 4, "exclusive defaults tiers");
}
#[test]
#[serial_test::serial(real_fs)] fn try_apply_aligns_config_selection_with_the_request_target() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
unsafe { std::env::remove_var("NEWT_PROVIDER") };
let base = || Config {
backends: vec![
BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
..Default::default()
},
BackendConfig {
name: "b".into(),
endpoint: "http://b:2".into(),
..Default::default()
},
],
default_backend: Some("a".into()),
..Default::default()
};
let mut cfg = base();
BackendOverride {
endpoint: Some("http://new:9".into()),
..Default::default()
}
.try_apply(&mut cfg)
.unwrap();
assert_eq!(cfg.default_backend.as_deref(), Some("cli"));
assert_eq!(
cfg.select_configured_backend().map(|b| b.name.as_str()),
Some("cli"),
"no stale selection after the exclusive request"
);
let mut cfg = base();
BackendOverride {
name: Some("b".into()),
model: Some("m".into()),
..Default::default()
}
.try_apply(&mut cfg)
.unwrap();
assert_eq!(cfg.default_backend.as_deref(), Some("b"));
assert_eq!(
cfg.select_configured_backend().map(|b| b.name.as_str()),
Some("b")
);
let mut cfg = base();
BackendOverride {
model: Some("m".into()),
..Default::default()
}
.try_apply(&mut cfg)
.unwrap();
assert_eq!(cfg.default_backend.as_deref(), Some("a"), "unchanged");
assert_eq!(cfg.backends[0].model.as_deref(), Some("m"));
}
#[test]
#[serial_test::serial(real_fs)] fn a_destabilizing_unnamed_kind_edit_requires_a_name() {
let _g = crate::test_guard::GlobalSettingsGuard::acquire();
unsafe { std::env::remove_var("NEWT_PROVIDER") };
let base = || Config {
backends: vec![
BackendConfig {
name: "b".into(),
endpoint: "http://b:1".into(),
kind: Some(BackendKind::Ollama),
..Default::default()
},
BackendConfig {
name: "a".into(),
endpoint: "http://a:2".into(),
kind: Some(BackendKind::Openai),
..Default::default()
},
],
..Default::default()
};
let over = BackendOverride {
kind: Some(BackendKind::Ollama),
..Default::default()
};
let mut cfg = base();
let err = resolve_for_test(&mut cfg, &[], Some(over)).expect_err("diverges");
assert!(err.contains("--backend-name"), "{err}");
let over = BackendOverride {
name: Some("a".into()),
kind: Some(BackendKind::Ollama),
..Default::default()
};
let mut cfg = base();
resolve_for_test(&mut cfg, &[], Some(over)).unwrap();
assert_eq!(cfg.backends[1].kind, Some(BackendKind::Ollama));
}
#[test]
fn an_empty_model_request_is_refused_never_a_stale_fallback() {
let base = || Config {
backends: vec![BackendConfig {
name: "a".into(),
endpoint: "http://a:1".into(),
model: Some("declared-a".into()),
card: Some("card-a".into()),
..Default::default()
}],
..Default::default()
};
let snap = |cfg: &Config| -> Vec<String> {
cfg.backends
.iter()
.map(|b| toml::to_string(b).unwrap())
.collect()
};
let untouched = snap(&base());
for model in ["", " "] {
for card in [None, Some("card-c")] {
let over = BackendOverride {
name: Some("a".into()),
model: Some(model.to_string()),
card: card.map(str::to_string),
..Default::default()
};
let mut cfg = base();
let err = resolve_for_test(&mut cfg, &[], Some(over.clone()))
.expect_err("an empty model request must refuse");
assert!(err.contains("--backend-model"), "{err}");
let mut cfg = base();
assert!(over.try_apply(&mut cfg).is_err(), "try_apply refuses too");
assert_eq!(snap(&cfg), untouched, "config untouched on refusal");
assert_eq!(
cfg.backends[0].model.as_deref(),
Some("declared-a"),
"the declared model is neither cleared nor re-bound"
);
}
}
}