test: migrate to MSW testing architecture for App integration test

Major testing infrastructure upgrade from manual mocks to Mock Service Worker (MSW):

New MSW infrastructure (tests/msw/):
- Add state.ts: In-memory state manager with full CRUD operations
  - Manage providers and current selections per app type (Claude/Codex)
  - Auto-switch current provider when deleted
  - Deep clone to prevent reference pollution
- Add handlers.ts: HTTP request handlers for 10 Tauri API endpoints
  - Mock get_providers, switch_provider, add/update/delete_provider
  - Mock update_sort_order, update_tray_menu, import_default_config
  - Support error scenarios (404 for non-existent providers)
- Add tauriMocks.ts: Tauri API mock layer
  - Transparently convert invoke() calls to HTTP requests
  - Mock event listener system with emitTauriEvent helper
  - Use cross-fetch for Node.js environment
- Add server.ts: MSW server setup for Node.js test environment

Refactor App.test.tsx (-170 lines, -43%):
- Remove 23 manual mocks (useProvidersQuery, useProviderActions, etc.)
- Run real hooks with MSW-backed API calls instead of mock implementations
- Test real state changes instead of mock call counts
- Add comprehensive flow: duplicate → create → edit → delete → event listening
- Verify actual provider list changes and current selection updates

Setup integration:
- Add MSW server lifecycle to tests/setupTests.ts
  - Start server before all tests
  - Reset handlers and state after each test
  - Close server after all tests complete
- Clear all mocks in afterEach for test isolation

Dependencies:
- Add msw@^2.11.6 for API mocking
- Add cross-fetch@^4.1.0 for fetch polyfill in Node.js

Type fixes:
- Add missing imports (AppType, Provider) in handlers.ts
- Fix HttpResponse.json generic constraint with as any (MSW best practice)
- Change invalid category "default" to "official" in state.ts

Test results: All 50 tests passing across 8 files, 0 TypeScript errors
This commit is contained in:
Jason
2025-10-25 16:48:43 +08:00
parent 2c7dcb023a
commit 96a8712f2d
8 changed files with 793 additions and 265 deletions

View File

@@ -1,10 +1,14 @@
import "@testing-library/jest-dom";
import { afterEach, beforeAll } from "vitest";
import { afterAll, afterEach, beforeAll, vi } from "vitest";
import { cleanup } from "@testing-library/react";
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import { server } from "./msw/server";
import { resetProviderState } from "./msw/state";
import "./msw/tauriMocks";
beforeAll(async () => {
server.listen({ onUnhandledRequest: "warn" });
await i18n.use(initReactI18next).init({
lng: "zh",
fallbackLng: "zh",
@@ -20,4 +24,11 @@ beforeAll(async () => {
afterEach(() => {
cleanup();
resetProviderState();
server.resetHandlers();
vi.clearAllMocks();
});
afterAll(() => {
server.close();
});