feat: add testing infrastructure — Vitest, Playwright, CI, git hooks
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:
parent
036af95e00
commit
1e30ba23cd
35 changed files with 3637 additions and 5 deletions
64
e2e/events.spec.js
Normal file
64
e2e/events.spec.js
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
import { test, expect } from '@playwright/test'
|
||||
|
||||
test.describe('Events list page', () => {
|
||||
test('events list loads', async ({ page }) => {
|
||||
await page.goto('/events')
|
||||
await expect(page.locator('h1', { hasText: 'Events' })).toBeVisible()
|
||||
})
|
||||
|
||||
test('filter bar has type filters', async ({ page }) => {
|
||||
await page.goto('/events')
|
||||
const filterBar = page.locator('.filter-bar')
|
||||
await expect(filterBar).toBeVisible()
|
||||
|
||||
for (const label of ['All', 'Workshops', 'Community', 'Social', 'Showcase']) {
|
||||
await expect(filterBar.locator('button', { hasText: label })).toBeVisible()
|
||||
}
|
||||
})
|
||||
|
||||
test('past events toggle exists and can be checked', async ({ page }) => {
|
||||
await page.goto('/events')
|
||||
const checkbox = page.locator('input[type="checkbox"]')
|
||||
await expect(checkbox).toBeVisible()
|
||||
await expect(page.locator('text=Show past events')).toBeVisible()
|
||||
|
||||
await checkbox.check()
|
||||
await expect(checkbox).toBeChecked()
|
||||
|
||||
// Page should still render without errors after toggling
|
||||
await expect(page.locator('h1', { hasText: 'Events' })).toBeVisible()
|
||||
})
|
||||
|
||||
test('clicking a filter button activates it', async ({ page }) => {
|
||||
await page.goto('/events')
|
||||
const workshopsBtn = page.locator('.filter-bar button', { hasText: 'Workshops' })
|
||||
await workshopsBtn.click()
|
||||
await expect(workshopsBtn).toHaveClass(/active/)
|
||||
})
|
||||
|
||||
test('event links navigate to detail page', async ({ page }) => {
|
||||
await page.goto('/events')
|
||||
|
||||
// Check the past events toggle so we see all events
|
||||
await page.locator('input[type="checkbox"]').check()
|
||||
|
||||
const eventLinks = page.locator('.event-row a')
|
||||
const count = await eventLinks.count()
|
||||
|
||||
if (count === 0) {
|
||||
// No events in the database — just verify the empty state renders
|
||||
await expect(page.locator('.empty', { hasText: 'No events found' })).toBeVisible()
|
||||
return
|
||||
}
|
||||
|
||||
// Click the first event link and verify navigation
|
||||
const firstLink = eventLinks.first()
|
||||
const href = await firstLink.getAttribute('href')
|
||||
await firstLink.click()
|
||||
await page.waitForURL(/\/events\//)
|
||||
|
||||
expect(page.url()).toContain('/events/')
|
||||
// Detail page should have an h1 with the event title
|
||||
await expect(page.locator('h1')).toBeVisible()
|
||||
})
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue