use super::model;
use crate::render::Form;
use crate::test_support::Scratch;
use crate::test_support::wire::{flat, wired};
use serde_json::{Value, json};
fn offers(ids: &[&str]) -> Value {
json!({"ok": true, "kind": "models", "rows": ids})
}
fn wrote() -> Value {
json!({"ok": true, "kind": "outcome", "exit": 0, "stdout": "", "stderr": ""})
}
fn assigned(scratch: &Scratch, id: &str) -> (crate::cli::Verdict, Vec<String>) {
let mut warned: Vec<String> = Vec::new();
let verdict = model(
scratch.path(),
"home",
"worker",
"claude-session-direct",
id,
Form::Json,
&mut |said| warned.push(said.to_owned()),
);
(verdict, warned)
}
#[test]
fn an_id_the_provider_does_not_offer_is_named_beside_the_whole_row() {
let scratch = Scratch::new();
let engine = wired(
&scratch,
&flat(),
vec![vec![offers(&["opus-5", "sonnet-4"])], vec![wrote()]],
);
let (verdict, warned) = assigned(&scratch, "not-a-real-model-xyz");
assert_eq!(verdict.code, 0, "the assignment still lands");
assert_eq!(warned.len(), 1, "{warned:?}");
let said = &warned[0];
assert!(said.contains("not-a-real-model-xyz"), "{said}");
assert!(said.contains("assigning it anyway"), "{said}");
assert!(said.contains("opus-5, sonnet-4"), "{said}");
assert!(
engine
.heard()
.contains(&json!({"op": "model", "workspace": "home",
"role": "worker",
"provider": "claude-session-direct",
"model": "not-a-real-model-xyz"})),
"{:?}",
engine.heard()
);
}
#[test]
fn an_id_the_provider_offers_is_assigned_in_silence() {
let scratch = Scratch::new();
wired(
&scratch,
&flat(),
vec![vec![offers(&["opus-5", "sonnet-4"])], vec![wrote()]],
);
let (verdict, warned) = assigned(&scratch, "opus-5");
assert_eq!(verdict.code, 0);
assert!(warned.is_empty(), "{warned:?}");
}
#[test]
fn a_row_that_cannot_say_what_it_offers_costs_the_assignment_nothing() {
for answer in [
json!({"ok": false, "error": "unknown provider `claude-session-direct`"}),
json!({"ok": true, "kind": "nudged"}),
offers(&[]),
] {
let scratch = Scratch::new();
wired(&scratch, &flat(), vec![vec![answer.clone()], vec![wrote()]]);
let (verdict, warned) = assigned(&scratch, "not-a-real-model-xyz");
assert_eq!(verdict.code, 0, "{answer}");
assert!(warned.is_empty(), "{answer}: {warned:?}");
}
}
#[test]
fn an_unreachable_channel_warns_nothing_and_the_assignment_says_why() {
let scratch = Scratch::new();
let (verdict, warned) = assigned(&scratch, "opus-5");
assert_eq!(verdict.code, 1);
assert!(warned.is_empty(), "{warned:?}");
assert!(
verdict.text.contains("no wire provisioned"),
"{}",
verdict.text
);
}