Files
planer/e2e/anmeldung.spec.ts
T
Florian WildeandClaude Opus 5 7919149879 fix: Navigation aufteilen, statt sie weiter zu dehnen
Mit dem dreizehnten Eintrag verschluckte die Leiste erneut Punkte am
rechten Rand — nach M6 zum zweiten Mal. Das Problem ist nicht die Breite,
sondern die Vermischung: Einrichtung und Verwaltung sucht man nicht beim
Arbeiten. Alltag bleibt in der Leiste, alles andere liegt hinter "Mehr".

Ein <details> statt eines Menues aus Skript: Es klappt ohne JavaScript
auf und braucht keine Zustandsverwaltung.

Zurueckgezogene Tokens stehen jetzt unten. Was noch Zugang hat, ist das,
wonach man sucht.

Zwei E2E-Tests greifen den neuen Weg ueber "Mehr" auf. Ein dritter wartet
das Neuladen ab, bevor er navigiert — die Meldung kommt frueher als die
fertige Liste, und Chromium bricht die Navigation sonst ab.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 18:52:35 +02:00

87 lines
3.4 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { expect, test } from '@playwright/test'
/**
* Rauchtest der Anmeldung.
*
* Prüft den Weg, der in M1 wirklich trägt: Wer nicht angemeldet ist, kommt
* nirgends hin; mit richtigem Passwort schon; und die Verwaltungsseite bleibt
* verschlossen, wenn die Rolle nicht reicht.
*
* Voraussetzung: "npm run db:seed" ist gelaufen und ADMIN_EMAIL sowie
* ADMIN_PASSWORT sind gesetzt.
*/
const EMAIL = process.env.ADMIN_EMAIL ?? ''
const PASSWORT = process.env.ADMIN_PASSWORT ?? ''
test.describe('Anmeldung', () => {
test.skip(
!EMAIL || !PASSWORT,
'ADMIN_EMAIL und ADMIN_PASSWORT sind nicht gesetzt – ohne sie gibt es kein Testkonto.',
)
test('leitet nicht Angemeldete zur Anmeldeseite', async ({ page }) => {
await page.goto('/')
await expect(page).toHaveURL(/\/anmelden/)
await expect(page.getByRole('heading', { name: 'Planer' })).toBeVisible()
})
test('merkt sich das Ziel und kehrt nach der Anmeldung dorthin zurück', async ({
page,
}) => {
await page.goto('/bereiche')
await expect(page).toHaveURL(/\/anmelden\?weiter=%2Fbereiche/)
})
test('weist falsche Zugangsdaten ab, ohne zu verraten warum', async ({ page }) => {
await page.goto('/anmelden')
await page.getByLabel('E-Mail-Adresse').fill(EMAIL)
await page.getByLabel('Passwort').fill('ganz-sicher-falsch-123')
await page.getByRole('button', { name: 'Mit Passwort anmelden' }).click()
await expect(page.getByText('Anmeldung nicht möglich')).toBeVisible()
await expect(page).toHaveURL(/\/anmelden/)
})
test('lässt mit richtigem Passwort hinein und wieder hinaus', async ({ page }) => {
await page.goto('/anmelden')
await page.getByLabel('E-Mail-Adresse').fill(EMAIL)
await page.getByLabel('Passwort').fill(PASSWORT)
await page.getByRole('button', { name: 'Mit Passwort anmelden' }).click()
await expect(page.getByRole('heading', { name: /Guten Tag/ })).toBeVisible()
// Alltagspunkte stehen in der Leiste, Einrichtung liegt hinter "Mehr".
await expect(page.getByRole('link', { name: 'Aufgaben', exact: true })).toBeVisible()
await expect(page.getByRole('link', { name: 'Bereiche', exact: true })).toBeHidden()
await page.getByText('Mehr', { exact: true }).click()
await expect(page.getByRole('link', { name: 'Bereiche', exact: true })).toBeVisible()
await page.getByTitle('Abmelden').click()
await expect(page).toHaveURL(/\/anmelden/)
})
test('zeigt der Verwaltung das Protokoll', async ({ page }) => {
await page.goto('/anmelden')
await page.getByLabel('E-Mail-Adresse').fill(EMAIL)
await page.getByLabel('Passwort').fill(PASSWORT)
await page.getByRole('button', { name: 'Mit Passwort anmelden' }).click()
await expect(page.getByRole('heading', { name: /Guten Tag/ })).toBeVisible()
// Das Protokoll liegt hinter "Mehr" – aufklappen, dann hin.
await page.getByText('Mehr', { exact: true }).click()
await page.getByRole('link', { name: 'Protokoll' }).click()
await expect(page.getByRole('heading', { name: 'Protokoll' })).toBeVisible()
})
})
test('der Health-Endpunkt antwortet ohne Anmeldung', async ({ request }) => {
const antwort = await request.get('/api/health')
expect(antwort.ok()).toBe(true)
const inhalt = (await antwort.json()) as Record<string, unknown>
expect(inhalt.status).toBe('ok')
expect(inhalt.datenbank).toBe('ok')
expect(typeof inhalt.version).toBe('string')
})