4 Commits
Author SHA1 Message Date
Jason c6daf78cea feat(usage): remember the last view and move display choices into settings
The usage page now reopens on the tab, preset range and trend/heatmap
metrics picked last time. These are kept in localStorage as local UI
preferences, not in settings.json. A custom date range does not replace
the remembered preset, and the app/provider/model filters are not kept.

The request log column picker moves from the table header into the
Display section of the settings tab, and the sidebar Today label becomes
the same kind of checklist (cost and tokens; stored values unchanged).
Currency, sidebar Today and log columns now sit on one row.
2026-10-16 19:29:24 +08:00
千羽and千羽 57b1eff1d4 feat(ui): v8 — theme color, unified controls, motion, virtual lists (#7816)
Unify the visual and interaction rules on top of the v7 redesign.

- Theme color #F97315 for --action-* and --ring; dark mode uses #EA580C
  with white text, toned-down mode colors and translucent soft fills
- Buttons mapped to three sizes (28 / 32 / 36); inputs, selects and
  search fields share fieldClass; self-drawn checkbox and radio
- HoverTip replaces title on about 100 icon buttons; it stays closed
  when a closing menu returns focus to its trigger
- Install tailwindcss-animate so menu, popover, dialog and tooltip
  enter/exit animations take effect; sliding segment thumb and tab
  underline
- Remove the command palette and the header prompt entry; provider card
  primary actions become icon buttons
- Virtualize the session list and the Skills discovery list; optimistic
  toggles for MCP and Skills with a 300ms delayed disabled state
- Toasts drawn unstyled with status-colored icons and de-duplicated
- Windows: hide the system title bar and use in-app window controls;
  macOS: brand row under the traffic lights
- Focus rings only for keyboard users
- Skills discovery and the prompt list show the last result from a
  local cache and refresh in the background
- Drop the trailing ellipsis from 36 dialog-opening labels
- Provider list fills the main area

Co-authored-by: 千羽 <qyinter@users.noreply.github.com>
2026-10-03 23:28:59 +08:00
Jason 96a8712f2d 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
2025-10-25 16:48:43 +08:00
Jason bbf830a1da 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
2025-10-25 10:08:06 +08:00