# 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