Retina clipboard images over the RGBA size cap were silently skipped; downscale and store a thumbnail so they still appear in history, with regression tests.
2.7 KiB
2.7 KiB
Testing
maCopy has an automated suite. There is no separate “live” Storybook/UI docs site yet — product behavior is documented in README / ROADMAP, and verified by tests.
Commands
| Command | What it runs |
|---|---|
npm test |
Frontend (Vitest + Testing Library, jsdom — CI default) |
npm run test:ui |
Same tests in the Vitest UI (open in your browser) |
npm run test:headed |
Unit tests in Chromium — still mostly a flash (DOM mount/unmount) |
npm run test:visual |
Watchable headed Playwright walkthrough of the real UI (visual.html) |
npm run test:watch |
Frontend in watch mode |
npm run test:rust |
Rust unit tests (cargo test) |
npm run test:all |
Frontend + Rust |
npm run lint |
TypeScript tsc --noEmit |
npm run check |
Lint + all tests (CI-style gate) |
Current counts (approx.): ~60 frontend + ~65 Rust unit tests.
What is covered
Frontend (src/**/*.test.tsx, transforms.test.ts)
- App: load entries, paste invoke, delete via keyboard
- ClipboardList: selection, multi-select modifiers, image stubs/thumbs (including truncated thumb previews), Alt=plain paste
- ContextMenu: Paste / Paste plain / transforms / Pin / Delete
- SettingsPanel: toggles, history limit, hotkey recorder, Launch at login → autostart enable
- SearchBar basics
- Transforms: plain text strip, JSON pretty, collapse / oneline
Tauri APIs are mocked in src/test/setup.ts (invoke, window, events, clipboard, autostart).
Backend (src-tauri/src/** #[cfg(test)])
- SQLite CRUD, FTS5, trim + pin preservation, settings
- List previews: truncate text, omit image blobs, return thumbnails (including stub
[image WxH]rows) - Search excludes image rows (text-only FTS)
- Sensitive redaction (card / password / banking) while
get_entrystays full - Hotkey parser (`cmd+`` etc.)
- Image thumbnail / PNG helpers +
fit_rgba_under_bytesagainst productionMAX_IMAGE_BYTES - Oversized / Retina screenshot prepare — never skip; downscale + thumb + DB list preview
- Clipboard content hashing fingerprints
What is not covered (yet)
- End-to-end UI on a real Mac (no Playwright against the Tauri window)
- Live pasteboard polling (requires macOS Accessibility / real
NSPasteboard) - Accessibility permission / AppleScript paste in CI
- Notarized release smoke tests
- Performance benchmarks in CI
- Prefer-image-when-text-also-present (poller text-wins path)
- Exclude-apps / pause-monitoring integration
Recommended workflow
npm run check # before every PR / commit
npm run tauri dev # manual smoke: hotkey, paste, redaction, thumbs
npm run tauri build # release .app when testing Login Items / signing