use super::*;
#[test]
fn a_default_claude_launch_keeps_completed_thinking_visible() {
for models in [
json!([
{"id": "future-native-id", "owned_by": "anthropic"},
{"id": "sonnet", "owned_by": "z.ai", "client_capabilities": {"claude": {"behaves_as": "claude-sonnet-4-5", "source": "provider-protocol:z.ai-anthropic"}}}
]),
json!([]),
] {
let profiles = tempfile::tempdir().expect("profile root");
let models: Vec<RouterModel> =
serde_json::from_value(models).expect("deserialize catalog fixture");
let prepared = TemporaryClient::prepare(&Preparation {
client: ClientKind::ClaudeCode,
base_url: "http://router.test",
token: "task-token",
model_override: None,
models: &models,
isolated_config: false,
extend_user_configuration: false,
one_shot: false,
profile_root: Some(profiles.path()),
codex_reasoning_effort: None,
codex_backend_base_url: None,
ca_cert: None,
})
.expect("prepare a default Claude launch");
let arguments = prepared
.command
.get_args()
.map(|argument| argument.to_string_lossy().into_owned())
.collect::<Vec<_>>();
let settings = arguments
.windows(2)
.find_map(|pair| (pair[0] == "--settings").then_some(&pair[1]))
.expect("a bare launch must still carry process-local settings");
let settings: serde_json::Value =
serde_json::from_str(settings).expect("valid settings JSON");
assert_eq!(
settings.get("verbose"),
Some(&json!(true)),
"a bare launch must keep completed thinking visible: {settings}"
);
assert_eq!(
settings.get("modelPicker"),
None,
"no filtered rows means no picker to write: {settings}"
);
assert_eq!(
settings.as_object().map(serde_json::Map::len),
Some(1),
"the process-local settings carry nothing else: {settings}"
);
}
}
#[test]
fn router_settings_precede_forwarded_claude_arguments() {
let profiles = tempfile::tempdir().expect("profile root");
let models: Vec<RouterModel> = serde_json::from_value(json!([
{"id": "future-glm-alpha", "owned_by": "z.ai", "client_capabilities": {"claude": {"behaves_as": "claude-sonnet-4-5", "source": "provider-protocol:z.ai-anthropic"}}}
]))
.expect("deserialize catalog fixture");
let mut prepared = TemporaryClient::prepare(&Preparation {
client: ClientKind::ClaudeCode,
base_url: "http://router.test",
token: "task-token",
model_override: None,
models: &models,
isolated_config: false,
extend_user_configuration: false,
one_shot: false,
profile_root: Some(profiles.path()),
codex_reasoning_effort: None,
codex_backend_base_url: None,
ca_cert: None,
})
.expect("prepare a default Claude launch");
prepared
.command
.args([std::ffi::OsString::from("--settings"), "{}".into()]);
let arguments = prepared
.command
.get_args()
.map(|argument| argument.to_string_lossy().into_owned())
.collect::<Vec<_>>();
let occurrences = arguments
.iter()
.enumerate()
.filter_map(|(index, argument)| (argument == "--settings").then_some(index))
.collect::<Vec<_>>();
assert_eq!(occurrences.len(), 2, "{arguments:?}");
assert!(
occurrences[0] < occurrences[1],
"Router's settings must come first so the user's override wins: {arguments:?}"
);
let router_settings: serde_json::Value =
serde_json::from_str(&arguments[occurrences[0] + 1]).expect("valid settings JSON");
assert_eq!(router_settings.get("verbose"), Some(&json!(true)));
}