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>
87 lines
3.4 KiB
TypeScript
87 lines
3.4 KiB
TypeScript
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')
|
||
})
|