1 Commits

Author SHA1 Message Date
ryan
37e9cc324f docs: frontend testing plan (Playwright + Vitest)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 11:32:32 +00:00

View File

@@ -0,0 +1,155 @@
# Frontend Testing Plan
## Overview
The admin frontend has grown significantly (station mode, POS, repairs intake, lessons). We need frontend testing to catch regressions and validate critical user flows.
## Recommended Stack
### Tier 1: Playwright (E2E)
**Priority: High — implement first**
End-to-end browser tests that exercise the full app against a running backend. Catches integration issues, routing problems, and real user flow regressions.
- **Framework:** Playwright (`@playwright/test`)
- **Runner:** `bun run test:e2e` (or `npx playwright test`)
- **Location:** `packages/admin/e2e/`
- **CI:** Runs in the `e2e` job alongside API tests (needs backend + DB + Valkey)
#### Critical flows to test first
1. **Login flow** — email/password login, redirect to dashboard, logout
2. **Forgot password** — submit email, see success message
3. **Station PIN login** — navigate to /station, enter PIN, unlock, see tabs
4. **Station tab switching** — POS → Repairs → Lessons, verify content renders
5. **POS sale** — search product, add to cart, complete cash payment, see receipt
6. **Repair intake** — new intake form, step through all steps, create ticket
7. **Repair queue** — filter by status, select ticket, see detail
8. **Session attendance** — open lessons tab, select session, mark attended
9. **Profile PIN setup** — navigate to profile, security tab, set PIN
10. **Auto-lock** — verify station locks after timeout
#### Setup
```bash
# Install
bun add -d @playwright/test
npx playwright install chromium
# Config: packages/admin/playwright.config.ts
# - baseURL: http://localhost:5173 (dev) or build + serve
# - webServer: start backend + frontend before tests
# - Use test DB with known seed data
```
#### Test structure
```
packages/admin/e2e/
fixtures/
auth.ts -- login helper, PIN login helper
seed.ts -- API calls to seed test data (accounts, products, tickets)
flows/
login.spec.ts
station-pos.spec.ts
station-repairs.spec.ts
station-lessons.spec.ts
profile.spec.ts
forgot-password.spec.ts
```
#### Auth fixtures
```ts
// Reusable login that stores auth state
async function loginAsAdmin(page) {
await page.goto('/login')
await page.fill('[type=email]', 'admin@test.com')
await page.fill('[type=password]', 'TestPassword123!')
await page.click('button[type=submit]')
await page.waitForURL('**/accounts**')
}
async function pinLogin(page, employeeNumber, pin) {
await page.goto('/station')
// Type PIN digits
for (const digit of employeeNumber + pin) {
await page.click(`button:has-text("${digit}")`)
}
await page.waitForSelector('[data-slot="tabs"]')
}
```
### Tier 2: Vitest + Testing Library (Component)
**Priority: Medium — implement after E2E**
Fast unit/integration tests for component logic, state management, and utility functions. Doesn't need a running backend (mocks API calls).
- **Framework:** Vitest + `@testing-library/react`
- **Runner:** `bun run test:unit` (in packages/admin)
- **Location:** `packages/admin/__tests__/`
#### What to test
- **Zustand stores:** `pos.store.ts`, `station.store.ts` — state transitions, lock/unlock, activity tracking
- **Form validation:** intake form step validation, PIN input, password requirements
- **Permission routing:** repairs-station permission check (desk vs tech), lessons-station (desk vs instructor)
- **Utility functions:** time formatting, status color mapping, receipt format toggle
- **Component rendering:** key components render without crashing with mock data
#### What NOT to test at component level
- API integration (covered by E2E + API tests)
- CSS/layout (covered by E2E visual checks)
- Third-party component internals (shadcn, radix)
### Tier 3: Visual Regression (Optional)
**Priority: Low — nice to have**
Screenshot comparison to catch unintended visual changes.
- **Tool:** Playwright's built-in screenshot comparison (`expect(page).toHaveScreenshot()`)
- **Scope:** Key pages only (login, station POS, repair intake, profile)
- **Storage:** Baseline screenshots committed to repo
## CI Integration
```yaml
# Add to .gitea/workflows/ci.yml
frontend-unit:
runs-on: ubuntu-latest
needs: ci
steps:
- uses: actions/checkout@v4
- run: curl -fsSL https://bun.sh/install | bash && echo "$HOME/.bun/bin" >> $GITHUB_PATH
- run: bun install --frozen-lockfile
- working-directory: packages/admin
run: bun run test:unit
frontend-e2e:
runs-on: ubuntu-latest
needs: ci
steps:
- uses: actions/checkout@v4
- run: curl -fsSL https://bun.sh/install | bash && echo "$HOME/.bun/bin" >> $GITHUB_PATH
- run: bun install --frozen-lockfile
- run: npx playwright install chromium --with-deps
# Start services (postgres, valkey)
# Run migrations + seed
# Start backend + frontend
# Run playwright tests
```
## Implementation Order
1. **Set up Playwright** — config, install, first smoke test (login page loads)
2. **Auth fixtures** — reusable login + PIN login helpers
3. **Seed fixtures** — create test data via API (reuse API test patterns)
4. **Login flow tests** — login, forgot password, redirect
5. **Station flow tests** — PIN login, tab switching, POS sale
6. **Repair flow tests** — intake form, queue, detail
7. **Lesson flow tests** — attendance, schedule view
8. **Set up Vitest** — config, first store test
9. **Store tests** — POS store, station store
10. **CI integration** — add to pipeline
## Estimated Effort
- Tier 1 (Playwright setup + 10 critical flows): ~1 session
- Tier 2 (Vitest setup + store/component tests): ~1 session
- CI integration: included in each tier