From e11c7d84cd65bd48695470a224f1fcea9bcff398 Mon Sep 17 00:00:00 2001 From: Jason Date: Fri, 14 Nov 2025 23:39:34 +0800 Subject: [PATCH] test(mcp): update import tests for v3.7.0 unified structure - Fix import_from_claude_merges_into_config: check unified mcp.servers - Fix import_from_codex_adds_servers_from_mcp_servers_table: verify apps.codex enabled - Fix import_from_codex_merges_into_existing_entries: test smart merge preserves existing config - Replace cc_switch_lib::app_config:: with public exports (McpServer, McpApps) All 24 import_export_sync tests now passing. --- src-tauri/tests/import_export_sync.rs | 122 +++++++++++++++----------- 1 file changed, 70 insertions(+), 52 deletions(-) diff --git a/src-tauri/tests/import_export_sync.rs b/src-tauri/tests/import_export_sync.rs index 4074170..f71ce1c 100644 --- a/src-tauri/tests/import_export_sync.rs +++ b/src-tauri/tests/import_export_sync.rs @@ -487,16 +487,12 @@ url = "https://example.com" let changed = cc_switch_lib::import_from_codex(&mut config).expect("import codex"); assert!(changed >= 2, "should import both servers"); - let servers = &config.mcp.codex.servers; - let echo = servers - .get("echo_server") - .and_then(|v| v.as_object()) - .expect("echo server"); - assert_eq!(echo.get("enabled").and_then(|v| v.as_bool()), Some(true)); - let server_spec = echo - .get("server") - .and_then(|v| v.as_object()) - .expect("server spec"); + // v3.7.0: 检查统一结构 + let servers = config.mcp.servers.as_ref().expect("unified servers should exist"); + + let echo = servers.get("echo_server").expect("echo server"); + assert_eq!(echo.apps.codex, true, "Codex app should be enabled for echo_server"); + let server_spec = echo.server.as_object().expect("server spec"); assert_eq!( server_spec .get("command") @@ -505,14 +501,9 @@ url = "https://example.com" "echo" ); - let http = servers - .get("http_server") - .and_then(|v| v.as_object()) - .expect("http server"); - let http_spec = http - .get("server") - .and_then(|v| v.as_object()) - .expect("http spec"); + let http = servers.get("http_server").expect("http server"); + assert_eq!(http.apps.codex, true, "Codex app should be enabled for http_server"); + let http_spec = http.server.as_object().expect("http spec"); assert_eq!( http_spec.get("url").and_then(|v| v.as_str()).unwrap_or(""), "https://example.com" @@ -537,36 +528,51 @@ command = "echo" .expect("write codex config"); let mut config = MultiAppConfig::default(); - config.mcp.codex.servers.insert( - "existing".into(), - json!({ - "id": "existing", - "name": "existing", - "enabled": false, - "server": { + // v3.7.0: 在统一结构中创建已存在的服务器 + config.mcp.servers = Some(std::collections::HashMap::new()); + config.mcp.servers.as_mut().unwrap().insert( + "existing".to_string(), + cc_switch_lib::McpServer { + id: "existing".to_string(), + name: "existing".to_string(), + server: json!({ "type": "stdio", "command": "prev" - } - }), + }), + apps: cc_switch_lib::McpApps { + claude: false, + codex: false, // 初始未启用 + gemini: false, + }, + description: None, + homepage: None, + docs: None, + tags: Vec::new(), + }, ); let changed = cc_switch_lib::import_from_codex(&mut config).expect("import codex"); assert!(changed >= 1, "should mark change for enabled flag"); + // v3.7.0: 检查统一结构 let entry = config .mcp - .codex .servers + .as_ref() + .unwrap() .get("existing") - .and_then(|v| v.as_object()) .expect("existing entry"); - assert_eq!(entry.get("enabled").and_then(|v| v.as_bool()), Some(true)); - let spec = entry - .get("server") - .and_then(|v| v.as_object()) - .expect("server spec"); - // 保留原 command,确保导入不会覆盖现有 server 细节 - assert_eq!(spec.get("command").and_then(|v| v.as_str()), Some("prev")); + + // 验证 Codex 应用已启用 + assert_eq!(entry.apps.codex, true, "Codex app should be enabled after import"); + + // 验证现有配置被保留(server 不应被覆盖) + let spec = entry.server.as_object().expect("server spec"); + assert_eq!( + spec.get("command").and_then(|v| v.as_str()), + Some("prev"), + "existing server config should be preserved, not overwritten by import" + ); } #[test] @@ -644,34 +650,46 @@ fn import_from_claude_merges_into_config() { .expect("write claude json"); let mut config = MultiAppConfig::default(); - config.mcp.claude.servers.insert( - "stdio-enabled".into(), - json!({ - "id": "stdio-enabled", - "name": "stdio-enabled", - "enabled": false, - "server": { + // v3.7.0: 在统一结构中创建已存在的服务器 + config.mcp.servers = Some(std::collections::HashMap::new()); + config.mcp.servers.as_mut().unwrap().insert( + "stdio-enabled".to_string(), + cc_switch_lib::McpServer { + id: "stdio-enabled".to_string(), + name: "stdio-enabled".to_string(), + server: json!({ "type": "stdio", "command": "prev" - } - }), + }), + apps: cc_switch_lib::McpApps { + claude: false, // 初始未启用 + codex: false, + gemini: false, + }, + description: None, + homepage: None, + docs: None, + tags: Vec::new(), + }, ); let changed = cc_switch_lib::import_from_claude(&mut config).expect("import from claude"); assert!(changed >= 1, "should mark at least one change"); + // v3.7.0: 检查统一结构 let entry = config .mcp - .claude .servers + .as_ref() + .unwrap() .get("stdio-enabled") - .and_then(|v| v.as_object()) .expect("entry exists"); - assert_eq!(entry.get("enabled").and_then(|v| v.as_bool()), Some(true)); - let server = entry - .get("server") - .and_then(|v| v.as_object()) - .expect("server obj"); + + // 验证 Claude 应用已启用 + assert_eq!(entry.apps.claude, true, "Claude app should be enabled after import"); + + // 验证现有配置被保留(server 不应被覆盖) + let server = entry.server.as_object().expect("server obj"); assert_eq!( server.get("command").and_then(|v| v.as_str()).unwrap_or(""), "prev",