Testing Strategy
This project takes a pragmatic approach to testing — fast, focused, and grounded in real-world behavior. Each layer is tested in the most reliable way possible given Chrome extension limitations.
What We Test
| Layer | Framework | Coverage Summary |
|---|---|---|
| Pure utilities | Vitest + jsdom | Snapshot tests for selectors, logic tests for extractLogin, tooltip rendering, etc. |
| Extension injection | Playwright (E2E) | Local test run (npm run e2e) launches a persistent Chrome context and confirms the extension injects into Twitch pages, observes DOM mutations, tags usernames with notes, and renders tooltips correctly. |
| DOM Integration | Playwright (smoke) | CI/CD check that verifies at least one username selector is still matching on Twitch pages. |
| Nightly Regression | GitHub Actions + Playwright | Scheduled smoketest detects Twitch DOM drift (e.g., layout or selector changes). |
What We Don’t Test (And Why)
| Feature | Reason |
|---|---|
| Context menu UI | Native Chrome menus aren’t exposed to automation frameworks like Playwright. |
prompt() note editing | prompt() blocks execution in headless browsers; tested via isolated logic. |
| Service worker lifetime | MV3 background scripts are unloaded after ~30 seconds idle. Messaging logic is unit-tested instead of E2E tested. |
CI/CD Integration
npm test: Runs unit tests via Vitest on every commit and push- Smoketests: Scheduled GitHub Action detects if Twitch selectors change unexpectedly
- Alerts: Failing smoketests automatically open a GitHub issue with the affected selectors
🔧 Common Test Commands
```bash npm run test # Run all unit tests npm run test:coverage # Show coverage report npm run e2e # Local-only Playwright test validates real extension behaviour npm run smoketest # Check if Twitch selectors are still valid HEADLESS=false npm run smoketest # Run smoketest with visible browser