refactor(backend): phase 4 - add test hooks and extend service layer

- Extract internal functions in commands/mcp.rs and commands/provider.rs
  to enable unit testing without Tauri context
- Add test hooks: set_mcp_enabled_test_hook, import_mcp_from_claude_test_hook,
  import_mcp_from_codex_test_hook, import_default_config_test_hook
- Migrate error types from String to AppError for precise error matching in tests
- Extend ProviderService with delete() method to unify Codex/Claude cleanup logic
- Add comprehensive test coverage:
  - tests/mcp_commands.rs: command-level tests for MCP operations
  - tests/provider_service.rs: service-level tests for switch/delete operations
- Run cargo fmt to fix formatting issues (EOF newlines)
- Update BACKEND_REFACTOR_PLAN.md to mark phase 3 complete
This commit is contained in:
Jason
2025-10-28 11:58:57 +08:00
parent c2e8855a0f
commit 7e27f88154
20 changed files with 1005 additions and 415 deletions

View File

@@ -88,17 +88,13 @@ command = "say"
"live auth.json should reflect new provider"
);
let config_text =
std::fs::read_to_string(get_codex_config_path()).expect("read config.toml");
let config_text = std::fs::read_to_string(get_codex_config_path()).expect("read config.toml");
assert!(
config_text.contains("mcp_servers.echo-server"),
"config.toml should contain synced MCP servers"
);
let locked = app_state
.config
.lock()
.expect("lock config after switch");
let locked = app_state.config.lock().expect("lock config after switch");
let manager = locked
.get_manager(&AppType::Codex)
.expect("codex manager after switch");
@@ -231,10 +227,7 @@ fn switch_provider_updates_claude_live_and_state() {
"live settings.json should reflect new provider auth"
);
let locked = app_state
.config
.lock()
.expect("lock config after switch");
let locked = app_state.config.lock().expect("lock config after switch");
let manager = locked
.get_manager(&AppType::Claude)
.expect("claude manager after switch");
@@ -265,8 +258,7 @@ fn switch_provider_updates_claude_live_and_state() {
drop(locked);
let home_dir =
std::env::var("HOME").expect("HOME should be set by ensure_test_home");
let home_dir = std::env::var("HOME").expect("HOME should be set by ensure_test_home");
let config_path = std::path::Path::new(&home_dir)
.join(".cc-switch")
.join("config.json");
@@ -325,13 +317,8 @@ fn switch_provider_codex_missing_auth_returns_error_and_keeps_state() {
other => panic!("expected config error, got {other:?}"),
}
let locked = app_state
.config
.lock()
.expect("lock config after failure");
let manager = locked
.get_manager(&AppType::Codex)
.expect("codex manager");
let locked = app_state.config.lock().expect("lock config after failure");
let manager = locked.get_manager(&AppType::Codex).expect("codex manager");
assert!(
manager.current.is_empty(),
"current provider should remain empty on failure"