From 4f17c718d8192776d8aedd1f39b0426ff81774e0 Mon Sep 17 00:00:00 2001 From: Marcel Date: Sat, 25 Apr 2026 01:25:24 +0200 Subject: [PATCH] test(e2e): fix locators, add print assertion, cleanup, remove redundant emulateMedia MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - help-popover: replace broad button[aria-expanded] with specific getByLabel('Lese- und Bearbeitungsmodus'); update role="tooltip" → role="region"; add afterAll doc cleanup (Sara/Tobias) - richtlinien: assert .new-tab spans are hidden in print media — the existing test only checked .app-nav (Sara) - transcribe-coach: remove 4× redundant page.emulateMedia({reducedMotion}) calls — playwright.config.ts already sets reducedMotion: 'reduce' globally; add afterAll doc cleanup (Tobias) Co-Authored-By: Claude Sonnet 4.6 --- frontend/e2e/help-popover.spec.ts | 16 +++++++++++----- frontend/e2e/richtlinien.spec.ts | 6 ++++++ frontend/e2e/transcribe-coach.spec.ts | 8 ++++---- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/frontend/e2e/help-popover.spec.ts b/frontend/e2e/help-popover.spec.ts index bc0f77c8..4a6fcc06 100644 --- a/frontend/e2e/help-popover.spec.ts +++ b/frontend/e2e/help-popover.spec.ts @@ -8,21 +8,27 @@ test.describe('Help chip — Read/Edit panel header', () => { docId = await createEmptyDocument(request); }); + test.afterAll(async ({ request }) => { + await request.delete(`/api/documents/${docId}`); + }); + test('opens popover on click, closes on Esc, returns focus to chip', async ({ page }) => { await page.goto(`/documents/${docId}`); await page.getByRole('button', { name: 'Transkribieren' }).click(); - // Find and click the (?) help chip - const helpBtn = page.locator('button[aria-expanded]'); + // Use the accessible label of the HelpPopover trigger (transcription_mode_help_label) + const helpBtn = page.getByRole('button', { name: 'Lese- und Bearbeitungsmodus' }); await expect(helpBtn).toBeVisible({ timeout: 5000 }); await helpBtn.click(); - // Popover should open - await expect(page.locator('[role="tooltip"]')).toBeVisible(); + // Popover should open (role="region", not tooltip — click-triggered panels are regions) + await expect(page.getByRole('region', { name: 'Lese- und Bearbeitungsmodus' })).toBeVisible(); // Press Esc await page.keyboard.press('Escape'); - await expect(page.locator('[role="tooltip"]')).not.toBeVisible(); + await expect( + page.getByRole('region', { name: 'Lese- und Bearbeitungsmodus' }) + ).not.toBeVisible(); // Focus should have returned to the chip await expect(helpBtn).toBeFocused(); diff --git a/frontend/e2e/richtlinien.spec.ts b/frontend/e2e/richtlinien.spec.ts index 1b5e52ea..5012fd5d 100644 --- a/frontend/e2e/richtlinien.spec.ts +++ b/frontend/e2e/richtlinien.spec.ts @@ -63,6 +63,12 @@ test.describe('Richtlinien page — print media', () => { await expect(nav).toBeHidden(); } + // .new-tab annotation spans must be hidden in print so "(öffnet in neuem Tab)" + // text does not clutter the printed output (the print CSS declares display:none) + for (const span of await page.locator('.new-tab').all()) { + await expect(span).toBeHidden(); + } + await page.screenshot({ path: 'test-results/e2e/richtlinien-print.png', fullPage: true }); }); }); diff --git a/frontend/e2e/transcribe-coach.spec.ts b/frontend/e2e/transcribe-coach.spec.ts index b54c7215..7ff94f64 100644 --- a/frontend/e2e/transcribe-coach.spec.ts +++ b/frontend/e2e/transcribe-coach.spec.ts @@ -13,10 +13,13 @@ test.describe('Transcribe coach — empty state', () => { docId = await createEmptyDocument(request); }); + test.afterAll(async ({ request }) => { + await request.delete(`/api/documents/${docId}`); + }); + 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(); @@ -31,14 +34,12 @@ test.describe('Transcribe coach — empty state', () => { }); 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({ @@ -50,7 +51,6 @@ test.describe('Transcribe coach — empty state', () => { }); 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();