// 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
#e58ceae chore(ci): refresh ci-snapshot.json
10/10 clean
42s ▾ +1s
48s ▴ +2s
247
unit specs
213
E2E flows
7
playwright projects
3
browser engines
// two-layer pyramid
Cheap where we can. Browser where we must.
vitest 247 specs
· 3s
playwright 213 specs
· 1m26s
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.
213
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
✓ 5s
pnpm test
✓ 3s
pnpm typecheck
✓ 10s
pnpm build
✓ 6s
playwright.yml
wait-for-preview
✓ 1s
run E2E vs preview URL
✓ 1m26s
// 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.