import { test, expect } from '@playwright/test'; import AxeBuilder from '@axe-core/playwright'; import { createEmptyDocument } from './helpers/upload-empty-document.js'; function buildAxe(page: Parameters[0]['page']) { return new AxeBuilder({ page }).withTags(['wcag2a', 'wcag2aa']); } test.describe('Transcribe coach — empty state', () => { let docId: string; test.beforeAll(async ({ request }) => { docId = await createEmptyDocument(request); }); test('shows coach card (title, preamble, three step bodies, animation region)', async ({ page }) => { await page.emulateMedia({ reducedMotion: 'reduce' }); await page.goto(`/documents/${docId}`); await page.getByRole('button', { name: 'Transkribieren' }).click(); await expect(page.getByRole('heading', { level: 2, name: /Erste Transkription/ })).toBeVisible({ timeout: 5000 }); await expect(page.getByText(/Kurrent-Erkenner lernt noch/)).toBeVisible(); await expect(page.getByText(/Rahmen ziehen/)).toBeVisible(); await expect(page.getByText(/Text eingeben/)).toBeVisible(); await expect(page.getByText(/Speichert automatisch/)).toBeVisible(); await expect(page.getByRole('img', { name: /Rahmen ziehen|Animation/i })).toBeVisible(); }); test('training footer is NOT visible on empty doc', async ({ page }) => { await page.emulateMedia({ reducedMotion: 'reduce' }); await page.goto(`/documents/${docId}`); await page.getByRole('button', { name: 'Transkribieren' }).click(); await expect(page.getByText('Für Training vormerken')).not.toBeVisible({ timeout: 3000 }); }); test('axe: panel empty state — light theme — no WCAG 2.1 AA violations', async ({ page }) => { await page.emulateMedia({ reducedMotion: 'reduce' }); await page.goto(`/documents/${docId}`); await page.getByRole('button', { name: 'Transkribieren' }).click(); await expect(page.getByRole('heading', { level: 2, name: /Erste Transkription/ })).toBeVisible({ timeout: 5000 }); const a11y = await buildAxe(page).analyze(); expect(a11y.violations, JSON.stringify(a11y.violations, null, 2)).toHaveLength(0); }); test('axe: panel empty state — dark theme — no WCAG 2.1 AA violations', async ({ page }) => { await page.emulateMedia({ reducedMotion: 'reduce' }); await page.goto(`/documents/${docId}`); // Toggle dark theme await page.getByRole('button', { name: /Farbmodus|theme/i }).click(); await page.getByRole('button', { name: 'Transkribieren' }).click(); await expect(page.getByRole('heading', { level: 2, name: /Erste Transkription/ })).toBeVisible({ timeout: 5000 }); const a11y = await buildAxe(page).analyze(); expect(a11y.violations, JSON.stringify(a11y.violations, null, 2)).toHaveLength(0); }); });