use super::*;
#[test]
fn tools_modal_open_toggle_clamp_and_close() {
let mut state = MissionControlState::default();
state.open_tools_modal(
vec![
ToolToggleRow {
name: "bash".to_string(),
kind: "built-in".to_string(),
enabled: true,
},
ToolToggleRow {
name: "mcp__mock__echo".to_string(),
kind: "mcp:mock".to_string(),
enabled: false,
},
],
1,
);
assert!(state.tools_modal_visible());
assert!(state.tools_modal_down(1));
assert_eq!(
state.toggle_selected_tool(),
Some(("mcp__mock__echo".to_string(), true))
);
state.set_tool_row_enabled("mcp__mock__echo", false);
assert!(!state.modals.tools_modal.as_ref().unwrap().rows[1].enabled);
assert!(state.close_tools_modal());
state.open_tools_modal(Vec::new(), 1);
assert_eq!(state.toggle_selected_tool(), None);
assert_eq!(state.modals.tools_modal.as_ref().unwrap().selected, 0);
}
#[test]
fn system_prompt_modal_open_scroll_and_close_preserves_unrelated_state() {
let mut state = MissionControlState {
prompt_editor: PromptEditor::new("draft", 5),
transcript: vec!["transcript".to_string()].into(),
provider: "provider".to_string(),
model: "model".to_string(),
provider_ready: true,
footer_session: "sess".to_string(),
footer_session_id: Some("sess".to_string()),
footer_cwd: "/tmp".to_string(),
..Default::default()
};
state.set_scroll_offset(&state.scroll_views.transcript, 3);
state.set_scroll_offset(&state.scroll_views.activity_tree, 4);
state.set_scroll_offset(&state.scroll_views.detail, 5);
state.open_system_prompt_modal("one two three four five six".to_string());
assert_eq!(state.scroll_offset(&state.scroll_views.system_prompt), 0);
state.scroll_system_prompt_down_by(10, 1, 5);
assert!(state.scroll_offset(&state.scroll_views.system_prompt) > 0);
state.scroll_system_prompt_up_by(u16::MAX, 1, 5);
assert_eq!(state.scroll_offset(&state.scroll_views.system_prompt), 0);
assert!(state.close_system_prompt_modal());
assert_eq!(state.prompt_plain_text(), "draft");
assert_eq!(state.prompt_cursor(), 5);
assert_eq!(state.transcript, vec!["transcript"]);
assert_eq!(state.transcript_scroll_offset(), 3);
assert_eq!(state.activity_scroll_offset(), 4);
assert_eq!(state.detail_offset(), 5);
assert_eq!(state.provider, "provider");
assert_eq!(state.model, "model");
assert!(state.provider_ready);
assert_eq!(state.footer_session, "sess");
assert_eq!(state.footer_cwd, "/tmp");
}
#[test]
fn connect_provider_debug_redacts_transient_and_secret_values_but_keeps_metadata() {
let mut state = MissionControlState::default();
state.open_connect_provider(Vec::new(), Some("safe notice".to_string()));
state.start_connect_custom_configuration();
{
let connect = state.modals.connect_provider.as_mut().unwrap();
connect.provider_id = Some("safe-provider".to_string());
connect.label.set_value("Safe Provider");
connect.base_url.set_value("https://provider.example/v1");
connect.api_key_env_var.set_value("sk-state-debug-secret");
connect.instructions = "oauth instruction state sentinel".to_string();
connect.url = "https://auth.example/authorize?code=oauth-query-state-sentinel".to_string();
connect.fallback_input.set_value("fallback-state-sentinel");
connect.notice = Some("safe notice".to_string());
connect.error = Some("safe error".to_string());
connect.success = Some("safe success".to_string());
}
state.open_connect_provider_replacement_confirmation(
"safe-provider".to_string(),
"Existing Safe Provider".to_string(),
"Replacement Safe Provider".to_string(),
"https://provider.example/v1?token=replacement-query-state-sentinel".to_string(),
Some("sk-replacement-debug-secret".to_string()),
);
let connect_debug = format!("{:?}", state.modals.connect_provider.as_ref().unwrap());
let modal_debug = format!("{:?}", state.modals);
for debug in [&connect_debug, &modal_debug] {
assert!(!debug.contains("fallback-state-sentinel"), "{debug}");
assert!(
!debug.contains("oauth instruction state sentinel"),
"{debug}"
);
assert!(!debug.contains("oauth-query-state-sentinel"), "{debug}");
assert!(!debug.contains("sk-state-debug-secret"), "{debug}");
assert!(!debug.contains("sk-replacement-debug-secret"), "{debug}");
assert!(debug.contains("safe-provider"), "{debug}");
assert!(debug.contains("Safe Provider"), "{debug}");
assert!(debug.contains("provider.example/v1"), "{debug}");
}
assert!(connect_debug.contains("safe notice"), "{connect_debug}");
assert!(connect_debug.contains("<redacted>"), "{connect_debug}");
}