use super::*;
use crate::shared::config::ServerMode;
fn external_unnamed(orch: &mut Orchestrator) {
orch.config.engine.mode = ServerMode::External;
orch.config.engine.external.url = Some("http://127.0.0.1:9/v1".into());
orch.config.engine.external.model_name = None;
}
#[test]
fn a_name_in_settings_outranks_what_the_engine_says() {
let (_d, mut orch) = bare_orch();
external_unnamed(&mut orch);
orch.config.engine.external.model_name = Some("qwen-3.6-27b".into());
let epoch = orch.model.epoch();
orch.handle_model_result(epoch, Some("gemma-4-31B_q4_0-it".into()));
assert_eq!(
orch.effective_model_name().as_deref(),
Some("qwen-3.6-27b"),
"a name the user typed is never overruled by the server's opinion"
);
}
#[test]
fn a_blank_field_falls_back_to_the_engines_own_answer() {
let (_d, mut orch) = bare_orch();
external_unnamed(&mut orch);
assert_eq!(orch.effective_model_name(), None, "nothing known yet");
let epoch = orch.model.epoch();
orch.handle_model_result(epoch, Some("gemma-4-31B_q4_0-it".into()));
assert_eq!(
orch.effective_model_name().as_deref(),
Some("gemma-4-31B_q4_0-it")
);
}
#[test]
fn an_engine_that_cannot_say_changes_nothing() {
let (_d, mut orch) = bare_orch();
external_unnamed(&mut orch);
let epoch = orch.model.epoch();
orch.handle_model_result(epoch, None);
assert_eq!(orch.effective_model_name(), None);
}
#[test]
fn the_discovered_name_is_sent_to_the_ui() {
let (_d, mut orch, mut rx) = bare_orch_rx();
external_unnamed(&mut orch);
let epoch = orch.model.epoch();
orch.handle_model_result(epoch, Some("gemma-4-31B_q4_0-it".into()));
let sent = std::iter::from_fn(|| rx.try_recv().ok())
.filter_map(|e| match e {
AppEvent::EngineModel(m) => Some(m),
_ => None,
})
.last();
assert_eq!(sent, Some(Some("gemma-4-31B_q4_0-it".into())));
}
#[tokio::test]
async fn an_answer_about_a_replaced_engine_is_dropped() {
let (_d, mut orch) = bare_orch();
external_unnamed(&mut orch);
let stale = orch.model.epoch();
orch.refresh_model_name();
orch.handle_model_result(stale, Some("the-previous-server".into()));
assert_eq!(
orch.effective_model_name(),
None,
"the late answer belonged to an engine that is gone"
);
}
#[tokio::test]
async fn changing_the_engine_forgets_the_name_and_says_so() {
let (_d, mut orch, mut rx) = bare_orch_rx();
external_unnamed(&mut orch);
let epoch = orch.model.epoch();
orch.handle_model_result(epoch, Some("gemma-4-31B_q4_0-it".into()));
while rx.try_recv().is_ok() {}
orch.refresh_model_name();
assert_eq!(orch.effective_model_name(), None);
let sent = std::iter::from_fn(|| rx.try_recv().ok())
.filter_map(|e| match e {
AppEvent::EngineModel(m) => Some(m),
_ => None,
})
.last();
assert_eq!(sent, Some(None), "the caption must be cleared at once");
}
#[tokio::test]
async fn a_named_engine_is_never_asked() {
let (_d, mut orch) = bare_orch();
external_unnamed(&mut orch);
orch.config.engine.external.model_name = Some("qwen-3.6-27b".into());
orch.refresh_model_name();
assert!(!orch.model.pending(), "settings already answered");
orch.config.engine.mode = ServerMode::Claude;
orch.config.engine.claude.model_name = Some("claude-opus-4-8".into());
orch.refresh_model_name();
assert!(!orch.model.pending());
}