cfb38e8fc6
- Global setup: authenticates as admin, saves storageState for reuse - playwright.config.ts: 3 projects (setup, authenticated, unauthenticated) - authenticated-admin.spec.ts: 16 admin pages tested with real auth session - accessibility.spec.ts: axe-core scans on all admin, public, and portal pages - visual-regression.spec.ts: dark mode baselines for key pages (toHaveScreenshot) - @axe-core/playwright added as devDependency - .gitignore updated: excludes .auth/ and test-results/ Full suite: 262 tests passing (setup:1, authenticated:52, unauthenticated:209)
51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
import { expect, test as setup } from "@playwright/test"
|
|
import path from "path"
|
|
import fs from "fs"
|
|
|
|
/**
|
|
* Global setup — authenticates as admin and saves the session state
|
|
* so all authenticated tests can reuse it without logging in again.
|
|
*
|
|
* Runs as a Playwright "setup project" that other projects depend on.
|
|
*/
|
|
|
|
const authDir = path.join(__dirname, ".auth")
|
|
const authFile = path.join(authDir, "admin.json")
|
|
|
|
setup("authenticate as admin", async ({ page, context }) => {
|
|
const baseURL = "http://localhost:3000"
|
|
|
|
// Ensure .auth directory exists
|
|
if (!fs.existsSync(authDir)) {
|
|
fs.mkdirSync(authDir, { recursive: true })
|
|
}
|
|
|
|
// Navigate to login page
|
|
await page.goto(`${baseURL}/login`)
|
|
await page.waitForLoadState("domcontentloaded")
|
|
|
|
// Fill credentials and submit
|
|
await page.fill('input[name="email"], input[type="email"]', "admin@test.de")
|
|
await page.fill(
|
|
'input[name="password"], input[type="password"]',
|
|
"test123"
|
|
)
|
|
await page.click('button[type="submit"]')
|
|
|
|
// Wait for successful redirect away from login
|
|
await page.waitForURL((url) => !url.pathname.includes("/login"), {
|
|
timeout: 15000,
|
|
})
|
|
|
|
// Wait for session cookies to settle
|
|
await page.waitForLoadState("domcontentloaded")
|
|
await page.waitForTimeout(1000)
|
|
|
|
// Verify we're authenticated (sanity check)
|
|
const url = page.url()
|
|
expect(url).not.toContain("/login")
|
|
|
|
// Save the authenticated state (cookies + localStorage)
|
|
await context.storageState({ path: authFile })
|
|
})
|