feat: add testing infrastructure — Vitest, Playwright, CI, git hooks
Some checks are pending
Test / vitest (push) Waiting to run
Test / playwright (push) Blocked by required conditions
Test / visual (push) Blocked by required conditions

Add comprehensive testing covering 420 unit/handler tests across 24 Vitest
files, 9 Playwright E2E specs, accessibility scans, and visual regression.
Includes GitHub Actions CI, Husky pre-push hook, and TESTING.md docs.
This commit is contained in:
Jennie Robinson Faber 2026-04-04 16:07:21 +01:00
parent 036af95e00
commit 1e30ba23cd
35 changed files with 3637 additions and 5 deletions

21
e2e/helpers/auth.js Normal file
View file

@ -0,0 +1,21 @@
/**
* Login helpers using dev endpoints.
* These set real httpOnly JWT cookies so all middleware works naturally.
*/
/**
* Login as admin via the dev test-login endpoint.
* Creates a test admin user if none exists.
*/
export async function loginAsAdmin(page) {
await page.goto('/api/dev/test-login')
await page.waitForURL('**/admin**')
}
/**
* Login as a specific member by email via the dev member-login endpoint.
*/
export async function loginAsMember(page, email) {
await page.goto(`/api/dev/member-login?email=${encodeURIComponent(email)}`)
await page.waitForURL('**/member/**')
}

23
e2e/helpers/fixtures.js Normal file
View file

@ -0,0 +1,23 @@
import { test as base } from '@playwright/test'
import { loginAsAdmin, loginAsMember } from './auth.js'
/**
* Extended test fixtures with pre-authenticated pages.
*/
export const test = base.extend({
adminPage: async ({ page }, use) => {
await loginAsAdmin(page)
await use(page)
},
memberPage: async ({ browser }, use) => {
// Uses a default test member — tests needing a specific member
// should use loginAsMember directly
const context = await browser.newContext()
const page = await context.newPage()
await loginAsMember(page, 'test-admin@ghostguild.dev')
await use(page)
await context.close()
},
})
export { expect } from '@playwright/test'