import { expect, test } from '@playwright/test' test('Gesundheitsendpunkt antwortet mit allen drei Abhaengigkeiten', async ({ request }) => { const response = await request.get('/api/health') expect([200, 503]).toContain(response.status()) const body = await response.json() expect(Object.keys(body.components).sort()).toEqual(['clamav', 'database', 'discordGateway']) }) test('Antwort traegt eine strikte Inhaltsrichtlinie', async ({ page }) => { const response = await page.goto('/anmelden') const csp = response?.headers()['content-security-policy'] ?? '' expect(csp).toContain("object-src 'none'") expect(csp).toContain("frame-ancestors 'none'") expect(csp).toMatch(/script-src [^;]*'nonce-/) expect(csp).not.toMatch(/script-src [^;]*'unsafe-inline'/) }) test('Anmeldeseite bietet den Discord-Weg an', async ({ page }) => { await page.goto('/anmelden') await expect(page.getByRole('button', { name: 'Mit Discord anmelden' })).toBeVisible() }) test('Startseite fuehrt Nichtangemeldete zur Anmeldung', async ({ page }) => { await page.goto('/') await expect(page).toHaveURL(/\/anmelden$/) }) test.describe('Geschuetzte Bereiche', () => { for (const pfad of ['/uebersicht', '/admin/rollen', '/admin/system']) { test(`${pfad} ist ohne Anmeldung nicht erreichbar`, async ({ page }) => { await page.goto(pfad) await expect(page).toHaveURL(/\/anmelden$/) }) } }) test('Fehlerseite benennt den Grund der Ablehnung', async ({ page }) => { await page.goto('/anmelden/fehler?grund=keine-afis-rolle') await expect(page.getByRole('heading', { level: 1 })).toHaveText( 'Keine Berechtigung für das Aktensystem', ) await page.goto('/anmelden/fehler?grund=keine-mitgliedschaft') await expect(page.getByRole('heading', { level: 1 })).toHaveText( 'Du bist nicht auf dem AfiS-Discord', ) })