magi-code 0.77.1

Repository-aware CLI coding agent for terminal work
Documentation
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}");
}