mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-06-16 13:34:04 +08:00
refactor/ui
17 Commits
-
feat(settings): add autoSaveSettings for lightweight auto-save
Add optimized auto-save function for General tab settings. - Add autoSaveSettings method for non-destructive auto-save - Only trigger system APIs when values actually change - Avoid unnecessary auto-launch and plugin config updates - Update tests to cover new functionality
YoVinchen ·
2025-11-22 15:27:32 +08:00 -
test: update test suites to match component refactoring
Comprehensive test updates to align with recent component refactoring and new auto-launch functionality. Component Tests: - AddProviderDialog.test.tsx (10 lines): * Updated test cases for new dialog behavior * Enhanced mock data for preset selection * Improved assertions for validation - ImportExportSection.test.tsx (16 lines): * Updated for new settings page integration * Enhanced test coverage for error scenarios * Better mock state management - McpFormModal.test.tsx (60 lines): * Extensive updates for form refactoring * New test cases for multi-app selection * Enhanced validation testing * Better coverage of stdio/http server types - ProviderList.test.tsx (11 lines): * Updated for new card layout * Enhanced drag-and-drop testing - SettingsDialog.test.tsx (96 lines): * Major updates for SettingsPage migration * New test cases for auto-launch functionality * Enhanced integration test coverage * Better async operation testing Hook Tests: - useDirectorySettings.test.tsx (32 lines): * Updated for refactored hook logic * Enhanced test coverage for edge cases - useDragSort.test.tsx (36 lines): * Simplified test cases * Better mock implementation * Improved assertions - useImportExport tests (16 lines total): * Updated for new error handling * Enhanced test coverage - useMcpValidation.test.tsx (23 lines): * Updated validation test cases * Better coverage of error scenarios - useProviderActions.test.tsx (48 lines): * Extensive updates for hook refactoring * New test cases for provider operations * Enhanced mock data - useSettings.test.tsx (12 lines): * New test cases for auto-launch * Enhanced settings state testing * Better async operation coverage Integration Tests: - App.test.tsx (41 lines): * Updated for new routing logic * Enhanced navigation testing * Better component integration coverage - SettingsDialog.test.tsx (88 lines): * Complete rewrite for SettingsPage * New integration test scenarios * Enhanced user workflow testing Mock Infrastructure: - handlers.ts (117 lines): * Major updates for MSW handlers * New handlers for auto-launch commands * Enhanced error simulation * Better request/response mocking - state.ts (37 lines): * Updated mock state structure * New state for auto-launch * Enhanced state reset functionality - tauriMocks.ts (10 lines): * Updated mock implementations * Better type safety - server.ts & testQueryClient.ts: * Minor cleanup (2 lines removed) Test Infrastructure Improvements: - Better test isolation - Enhanced mock data consistency - Improved async operation testing - Better error scenario coverage - Enhanced integration test patterns Coverage Improvements: - Net increase of 195 lines of test code - Better coverage of edge cases - Enhanced error path testing - Improved integration test scenarios - Better mock infrastructure All tests now pass with the refactored components while maintaining comprehensive coverage of functionality and edge cases.
YoVinchen ·
2025-11-21 11:12:06 +08:00 -
feat(mcp): add SSE (Server-Sent Events) transport type support
Add comprehensive support for SSE transport type to MCP server configuration, enabling real-time streaming connections alongside existing stdio and http types. Backend Changes: - Add SSE type validation in mcp.rs validate_server_spec() - Extend Codex TOML import/export to handle SSE servers - Update claude_mcp.rs legacy API for backward compatibility - Unify http/sse handling in json_server_to_toml_table() Frontend Changes: - Extend McpServerSpec type definition to include "sse" - Add SSE radio button to configuration wizard UI - Update wizard form logic to handle SSE url and headers - Add SSE validation in McpFormModal submission Validation & Error Handling: - Add SSE support in useMcpValidation hook (TOML/JSON) - Extend tomlUtils normalizeServerConfig for SSE parsing - Update Zod schemas (common.ts, mcp.ts) with SSE enum - Add SSE error message mapping in errorUtils Internationalization: - Add "typeSse" translations (zh: "sse", en: "sse") Tests: - Add SSE validation test cases in useMcpValidation.test.tsx SSE Configuration Format: { "type": "sse", "url": "https://api.example.com/sse", "headers": { "Authorization": "Bearer token" } }Jason ·
2025-11-16 16:15:17 +08:00 -
refactor(mcp): complete v3.7.0 cleanup - remove legacy code and warnings
This commit finalizes the v3.7.0 unified MCP architecture migration by removing all deprecated code paths and eliminating compiler warnings. Frontend Changes (~950 lines removed): - Remove deprecated components: McpPanel, McpListItem, McpToggle - Remove deprecated hook: useMcpActions - Remove unused API methods: importFrom*, syncEnabledTo*, syncAllServers - Simplify McpFormModal by removing dual-mode logic (unified/legacy) - Remove syncOtherSide checkbox and conflict detection - Clean up unused imports and state variables - Delete associated test files Backend Changes (~400 lines cleaned): - Remove unused Tauri commands: import_mcp_from_*, sync_enabled_mcp_to_* - Delete unused Gemini MCP functions: get_mcp_status, upsert/delete_mcp_server - Add #[allow(deprecated)] to compatibility layer commands - Add #[allow(dead_code)] to legacy helper functions for future migration - Simplify boolean expression in mcp.rs per Clippy suggestion API Deprecation: - Mark legacy APIs with @deprecated JSDoc (getConfig, upsertServerInConfig, etc.) - Preserve backward compatibility for v3.x, planned removal in v4.0 Verification: - ✅ Zero TypeScript errors (pnpm typecheck) - ✅ Zero Clippy warnings (cargo clippy) - ✅ All code formatted (prettier + cargo fmt) - ✅ Builds successfully Total cleanup: ~1,350 lines of code removed/marked Breaking changes: None (all legacy APIs still functional)
Jason ·
2025-11-14 22:43:25 +08:00 -
feat(frontend): implement unified MCP panel for v3.7.0
Complete Phase 3 (P0) frontend implementation for unified MCP management: **New Files:** - src/hooks/useMcp.ts: React Query hooks for unified MCP operations - src/components/mcp/UnifiedMcpPanel.tsx: Unified MCP management panel - src/components/ui/checkbox.tsx: Checkbox component from shadcn/ui **Features:** - Unified panel with three-column layout: server info + app checkboxes + actions - Multi-app control: Claude/Codex/Gemini checkboxes for each server - Real-time stats: Show enabled server counts per app - Full CRUD operations: Add, edit, delete, sync all servers **Integration:** - Replace old app-specific McpPanel with UnifiedMcpPanel in App.tsx - Update McpFormModal to support unified mode with apps field - Add i18n support: mcp.unifiedPanel namespace (zh/en) **Type Safety:** - Ensure McpServer.apps field always initialized - Fix all test files to include apps field - TypeScript type check passes ✅ **Architecture:** - Single source of truth: mcp.servers manages all MCP configs - Per-server app control: apps.claude/codex/gemini boolean flags - Backward compatible: McpFormModal supports both unified and legacy modes Next: P1 tasks (import dialogs, sub-components, tests)Jason ·
2025-11-14 15:24:48 +08:00 -
refactor(hooks): introduce unified post-change sync utility
- Add postChangeSync.ts utility with Result pattern for graceful error handling - Replace try-catch with syncCurrentProvidersLiveSafe in useImportExport - Add directory-change-triggered sync in useSettings to maintain SSOT - Introduce partial-success status to distinguish import success from sync failures - Add test coverage for sync behavior in different scenarios This refactoring ensures config.json changes are reliably synced to live files while providing better user feedback for edge cases.
Jason ·
2025-11-01 23:58:29 +08:00 -
test: add dual-parameter support and sync mocks for import/export tests
Update test infrastructure to support the dual app type parameter pattern (app_type enum + app string) introduced in
590be4e: - Add toast.warning mock for partial-success status handling - Add syncCurrentProvidersLive mock to test post-import sync behavior - Update MSW handlers to accept both app_type and app parameters with fallback resolution (app ?? app_type) across 7 provider endpoints - Add sync_current_providers_live endpoint mock returning success This ensures test compatibility during the app_type → app parameter migration and enables testing of the new partial-success import flow.Jason ·
2025-10-30 10:07:30 +08:00 -
fix: resolve TypeScript type errors in test files
- Add vitest/globals to tsconfig.json types array to provide type definitions for global test functions (describe, it, expect, vi) - Fix vi.fn type parameter in useDirectorySettings.test.tsx from <[], Promise<string>> to <() => Promise<string>> - Remove unused setMcpConfig import from MSW handlers - Add type assertions for mock.calls access in McpFormModal tests to resolve union type inference issues This ensures pnpm typecheck passes without errors while maintaining test functionality with vitest globals: true configuration.
Jason ·
2025-10-27 13:29:12 +08:00 -
test: extend MCP UI test coverage with wizard, TOML, and error handling
## McpFormModal Component Tests (+5 tests) ### Infrastructure Improvements - Enhance McpWizardModal mock from null to functional mock with testable onApply callback - Refactor renderForm helper to support custom onSave/onClose mock injection - Add McpServer type import for type-safe test data ### New Test Cases 1. **Wizard Integration**: Verify wizard generates config and auto-fills ID + JSON fields - Click "Use Wizard" → Apply → Form fields populated with wizard-id and config - Uses act() wrapper for React 18 async state updates 2. **TOML Auto-extraction (Codex)**: Test TOML → JSON conversion with ID extraction - Parse `[mcp.servers.demo]` → auto-fill ID as "demo" - Verify server object correctly parsed from TOML format - Codex-specific feature for config.toml compatibility 3. **TOML Validation Error**: Test missing required field handling - TOML with type="stdio" but no command → block submit - Display localized error toast: mcp.error.idRequired (3s duration) 4. **Edit Mode Immutability**: Verify ID field disabled during edit - ID input has disabled attribute and keeps original value - Config updates applied while enabled state preserved - syncOtherSide defaults to false in edit mode 5. **Error Recovery**: Test save failure button state restoration - Inject failing onSave mock → trigger error - Verify toast error displays translated message - Submit button disabled state resets to false for retry ## useMcpActions Hook Tests (+2 tests) ### New API Mocks - Add syncEnabledToClaude and syncEnabledToCodex mock functions ### New Test Cases 1. **Backend Error Message Mapping**: Map Chinese error to i18n key - Backend: "stdio 类型的 MCP 服务器必须包含 command 字段" - Frontend: mcp.error.commandRequired (6s toast duration) 2. **Cross-app Sync Logic**: Verify conditional sync behavior - claude → claude: setEnabled called, syncEnabledToClaude NOT called - Validates sync only occurs when crossing app types ## Minor Changes - McpPanel.test.tsx: Add trailing newline (formatter compliance) ## Test Coverage - Test files: 17 (unchanged) - Total tests: 112 → 119 (+7, +6.3%) - Execution time: 3.20s - All 119 tests passing ✅Jason ·
2025-10-26 15:03:05 +08:00 -
test: add MCP functionality tests achieving 100% hooks coverage
Milestone Achievement: 100% Hooks Coverage 🎉 - Hooks coverage: 87.5% (7/8) → 100% (8/8) - Total tests: 81 → 105 (+29.6%) - MCP functionality: 0 → 24 tests useMcpActions Tests (8 tests): - Test server reload with loading state management - Use deferred promise pattern to verify loading state transitions - Verify intermediate loading=true state during async operation - Verify error toast (duration: 6s) on reload failure - Ensure loading returns to false after error - Test optimistic toggle with rollback on failure - Immediately update enabled flag before API confirmation - Verify success toast messages for enable/disable - Roll back state to original value on API failure - Show error toast (duration: 6s) when toggle fails - Test server save with list refresh - Verify ID rewrite logic: saveServer(newId, {...input, id: oldId}) → {id: newId} - Verify syncOtherSide option correctly propagated to API - Refresh server list after successful save - Propagate errors to caller while showing error toast - Do not refresh list when save fails - Test server delete with state management - Verify deleteServerInConfig called with correct parameters - Verify list refresh removes deleted server - Show success toast (duration: 1.5s) on delete - Keep state unchanged on delete failure - Propagate error to caller with error toast useMcpValidation Tests (16 tests): - Test JSON validation (4 tests) - Return empty string for blank/whitespace text - Return "mcp.error.jsonInvalid" for parsing failures - Reject non-object types (string, array) - Accept valid object payloads - Test TOML error formatting (2 tests) - Map mustBeObject/parseError to "mcp.error.tomlInvalid" - Append error details for unknown errors - Test TOML config validation (5 tests) - Propagate errors from validateToml utility - Return "mcp.error.commandRequired" for stdio without command - Return "mcp.wizard.urlRequired" for http without url - Catch and format tomlToMcpServer exceptions - Return empty string when validation passes - Test JSON config validation (5 tests) - Reject invalid JSON syntax - Reject mcpServers array format (single object required) - Require command field for stdio type servers - Require url field for http type servers - Accept valid server configurations Technical Highlights: - Deferred Promise Pattern: Precise async timing control - Optimistic Updates: Test immediate feedback + rollback - Error Propagation: Distinguish caller errors vs toast notifications - i18n Validation: All validators return translation keys - Factory Functions: Reusable test data builders All tests passing: 105/105Jason ·
2025-10-26 11:56:24 +08:00 -
test: enhance useImportExport edge tests with mock refactor and callback verification
Mock Refactoring: - Extract saveFileDialogMock and exportConfigMock as variables - Previously used inline vi.fn() which prevented call verification - Now supports expect().toHaveBeenCalledWith() assertions - Enables parameter and return value validation - Add mock reset in beforeEach for test isolation - Reset saveFileDialogMock state - Reset exportConfigMock state - Ensures clean state for each test New Test: Import Failure Callback Verification - Add test "does not call onImportSuccess when import fails" - User selects file successfully - Import operation fails (success: false) - Verify onImportSuccess callback NOT called - Verify status becomes "error" - Prevents triggering success logic on failure New Test: Export Success Message Verification - Add test "propagates export success message to toast with saved path" - User selects save location: /exports/config.json - Backend saves to: /final/config.json (may differ) - Verify exportConfigMock called with user-selected path - Verify toast success message contains actual saved path - Ensures user sees correct save location Coverage Improvements: - Import failure callback: 50% → 100% - Export success message: 50% → 100% - Mock verification capability: 0% → 100% All tests passing: 81/81 (2 new tests)
Jason ·
2025-10-26 09:55:19 +08:00 -
test: add error handling and edge case tests for hooks
useSettings Tests: - Add test for null settings state protection - Returns null immediately without calling APIs - Prevents null pointer errors in save flow - Add test for save mutation failure - Verifies error propagates to caller - Ensures restart flag remains untouched on failure - Validates no side effects when save fails useProviderActions Tests: - Add error propagation tests for CRUD operations - updateProvider: propagates errors to caller - addProvider: propagates errors to caller - deleteProvider: propagates errors to caller - Add switch mutation error handling tests - Claude switch: handles errors silently (no throw) - Codex switch: skips plugin sync when mutation fails - Verifies plugin sync APIs not called on failure - Add loading state verification - Test all mutations pending scenario (existing) - Test all mutations idle scenario (new) - Ensures isLoading flag accuracy useImportExport Edge Case Tests (new file): - Add test for user cancelling file dialog - File dialog returns null (user cancelled) - State remains unchanged (selectedFile: "", status: "idle") - No error toast shown - Add test for resetStatus behavior - Clears error message and status - Preserves selected file path for retry - Resets backupId to null All tests passing: 79/79 (10 new tests)
Jason ·
2025-10-25 22:51:51 +08:00 -
test: add useDirectorySettings and useSettingsMetadata hook tests
useDirectorySettings Tests: - Test directory initialization with overrides and remote defaults - Verify app config override with space trimming - Load Claude/Codex directories from remote API - Calculate resolvedDirs correctly - Test directory browsing functionality - Browse Claude/Codex config directories - Browse app config directory with proper default paths - Update settings callback when selection succeeds - Test error handling scenarios - User cancels directory selection (returns null) - Directory picker throws error (shows toast) - Verify settings not updated on failure - Test directory reset operations - Reset individual directories to computed defaults - Reset app config directory - Batch reset with provided server values - Use vi.hoisted() for proper mock initialization - Factory function for settings creation (reusability) useSettingsMetadata Tests: - Test portable mode flag loading - Verify initial loading state - Load portable flag from API - Handle async state transitions - Test error tolerance when API fails - Silent failure on network errors - Default to non-portable mode - Continue without blocking UI - Test restart flag management - Set restart required flag - Acknowledge restart to clear flag - State updates wrapped in act() All tests passing: 10/10 (7 useDirectorySettings + 3 useSettingsMetadata)
Jason ·
2025-10-25 21:39:21 +08:00 -
test: add directory browsing/reset and useSettings hook tests
SettingsDialog Integration Tests: - Add test for directory browsing and reset functionality - Verify app config directory browse/reset flow - Verify Claude config directory manual change, browse, and reset - Test multiple directory inputs with getAllByTitle pattern - Add test for export failure error handling - User cancels file selection (save_file_dialog returns null) - Export operation fails (disk full scenario) - Use server.use() to dynamically override MSW handlers - Verify toast error messages match i18n keys MSW Handler Extension: - Add pick_directory handler to support directory selection API - Consistent with select_config_directory mock strategy useSettings Hook Unit Tests: - Add comprehensive tests for settings save logic - Test restart flag when app config directory changes - Test no restart when directory unchanged - Verify space trimming and empty string to undefined conversion - Test Claude plugin sync failure tolerance - Add test for settings reset functionality - Verify form/language/directories reset with server data - Use factory functions for mock creation (reusability) - Complete dependency isolation with mock hooks All tests passing: 9/9 (5 integration + 4 unit tests)
Jason ·
2025-10-25 20:43:47 +08:00 -
test: add comprehensive tests for hooks and components
Add extensive unit and component tests covering import/export, settings, and provider list functionality, advancing to Sprint 2 of test development. Hook Tests: - useImportExport (11 tests): * File selection success/failure flows * Import process with success/failure/exception paths * Export functionality with error handling * User cancellation scenarios * State management (clear selection, reset status) * Fake timers for async callback testing - useSettingsForm (5 tests): * Settings normalization on initialization * Language persistence from localStorage * Field updates with language sync * Reset functionality with initial language restoration * Optimization to avoid redundant language changes Component Tests: - ProviderList (3 tests): * Loading state with skeleton placeholders * Empty state with create callback * Render order from useDragSort with action callbacks * Props pass-through (isCurrent, isEditMode, dragHandleProps) * Mock ProviderCard to isolate component under test Technical Highlights: - Fake timers (vi.useFakeTimers) for async control - i18n mock with changeLanguage spy - Partial mock of @dnd-kit/sortable using vi.importActual - ProviderCard render spy for props verification - Comprehensive error handling coverage Test Coverage: ✓ 19 new test cases (11 + 5 + 3) ✓ Total: 35 tests passing ✓ Execution time: 865ms ✓ TypeScript: 0 errors Related: Import/export, settings management, provider list rendering Sprint Progress: Sprint 1 complete, Sprint 2 in progress (component tests)
Jason ·
2025-10-25 11:16:38 +08:00 -
test: add useProviderActions hook unit tests
- Add comprehensive tests for provider CRUD operations: * addProvider: trigger mutation correctly * updateProvider: update provider and refresh tray menu * deleteProvider: call delete mutation * isLoading: track all mutation pending states - Test Claude plugin integration sync logic: * Conditional sync based on app type (claude vs codex) * Integration toggle handling (enabled/disabled) * Error handling with custom/fallback messages * Official vs custom provider category detection - Test usage script save functionality: * Update provider meta and invalidate cache on success * Display error toast with custom/fallback messages on failure - Mock React Query mutations, Tauri API, and toast notifications - Fix TypeScript spread operator issues in mock definitions - Cover all success/failure paths and edge cases Test Coverage: ✓ 12 test cases covering provider actions ✓ Plugin sync: 5 scenarios (app type, toggle, errors) ✓ CRUD operations: add, update, delete ✓ Usage script: save success/failure ✓ Estimated 95%+ code coverage Related: Provider management, Claude plugin integration, usage scripts Total Tests: 16 passed (4 useDragSort + 12 useProviderActions)
Jason ·
2025-10-25 10:49:14 +08:00 -
test: add frontend testing infrastructure with vitest
- Introduce Vitest + React Testing Library + jsdom environment - Add useDragSort hook unit tests covering: * Sorting logic (sortIndex → createdAt → name) * Successful drag operation (API call + cache invalidation) * Failed drag operation (error toast display) * Edge case (no valid target, no API call) - Configure global test setup (i18n mock, auto cleanup) - Update TypeScript configs to include tests/ directory - Add test development plan documentation Test Coverage: ✓ Provider drag-and-drop sorting core logic ✓ React Query cache refresh ✓ Toast notification display ✓ Boundary condition handling Test Results: 4/4 passed (671ms) Next Steps: Sprint 2 - component tests with MSW mock layer
Jason ·
2025-10-25 10:08:06 +08:00