// testing.md
This page is its own test report.
Every number below comes from the same data and CI signals the site ships with. Nothing here is mocked.
- timjstacey/resume-static-site
- astro · tailwind · catppuccin
- vitest + playwright
- green gates every merge
main passing
#50dcd28 chore: set playwright and k6 docs as higher priority (#195)
9/10 clean
41s ▾ -1s
49s ▴ +1s
287
unit specs
222
E2E flows
7
playwright projects
3
browser engines
// two-layer pyramid
Cheap where we can. Browser where we must.
vitest 287 specs
· 3s
playwright 222 specs
· 1m46s
vitest
- → schema validation
- → pure helpers
- → data loaders
- → nav + format logic
playwright
- → page content per route
- → keyboard + focus a11y
- → responsive layout
- → theme switching
// project routing
Split by spec type. Skip the duplicates.
222
Content renders identically across engines, so it runs once. Only keyboard, focus, and viewport behaviour fan out across browsers.
content
- Desktop Chrome
- chromium
- homejobsprojectsresumea11y
a11y-chromium
- Desktop Chrome
- chromium
- navtheme-picker
a11y-firefox
- Desktop Firefox
- firefox
- navtheme-picker
a11y-webkit
- Desktop Safari
- webkit
- navtheme-picker
responsive-mobile-chrome
- Pixel 5
- chromium
- responsive
responsive-mobile-safari
- iPhone 13
- webkit
- responsive
responsive-tablet-safari
- iPad Pro 11
- webkit
- responsive
// ci gates
Two pipelines. Two minutes between green and merged.
ci.yml
check-claude-md
✓ 0s
pnpm lint
✓ 4s
pnpm test
✓ 3s
pnpm typecheck
✓ 9s
pnpm build
✓ 6s
playwright.yml
wait-for-preview
✓ 0s
run E2E vs preview URL
✓ 1m46s
// data-driven everything
One YAML. The site renders it. The tests assert against it.
resume.yml getResume() resume.spec.ts
jobs.yml getJobs() jobs.spec.ts
projects.yml getProjects() projects.spec.ts
jobs.spec.ts
import { getJobs } from '../src/lib/data';import { withKeys } from '../src/lib/jobhunt';
const jobs = withKeys(getJobs());
for (const job of jobs) { test(job.company, async ({ page }) => { await page.goto('/job-hunt'); await expect(card(job)).toBeVisible(); });}Everything on this page is in the repo.