Files
betreuungs-cockpit/playwright.config.ts
T
Florian Wilde 1a91f62ced feat: Erinnerungen, Wartungslauf und Playwright-Tests der Anmeldung
Etappe 8, erster Teil.

Erinnerungsmails sind bewusst eine Zugabe: Ist kein SMTP konfiguriert,
wird nichts gesendet und nichts geworfen. Die Fristen stehen ohnehin im
Dashboard und im abonnierten Kalender - eine ausgefallene Mail darf
nicht dazu fuehren, dass der Wartungslauf abbricht und danach auch das
Aufraeumen liegen bleibt.

In der Mail steht, DASS etwas faellig ist und wo man nachsieht - nicht,
worum es geht. Kein Name der betreuten Person, keine Inhalte. E-Mail ist
unterwegs unverschluesselt und landet auf fremden Servern.

Je Frist geht hoechstens eine Mail pro Vorwarnstufe raus. Taeglich waere
nach einer Woche Rauschen, das man wegklickt - und genau dann verpasst
man die eine, auf die es ankam.

Der Wartungslauf faengt jeden Schritt einzeln ab: Papierkorb leeren,
Anmeldeversuche und altes Audit-Log aufraeumen laufen auch dann, wenn
der SMTP-Server nicht antwortet. Angestossen wird er ueber
/api/wartung mit einem HMAC aus AUTH_SECRET - ohne gueltigen Schluessel
antwortet die Route mit 404 statt 401.

Ein echter Fund aus den Tests: Auth.js reicht den Fehlercode aus
authorize() nicht an die Server Action zurueck. Bei gesperrtem Zugang
sah man deshalb nur die allgemeine Meldung "stimmen nicht" und haette
ratlos weiterprobiert, obwohl die Sperre bereits lief. Die Sperre wird
jetzt zusaetzlich in der Server Action geprueft und benannt; die Pruefung
in authorize() bleibt als eigentliche Sperre bestehen.

Sechs Playwright-Tests der Anmeldung, darunter zwei, die
Sicherheitszusagen nachweisen: dass zwei Fehlversuche mit
unterschiedlicher Ursache dieselbe Meldung liefern (sonst liesse sich
ablesen, welche Adressen existieren), und dass die Anmeldeseite keine
einzige Anfrage an einen fremden Host stellt.

Etappe: 8
Phase: Haertung
2026-08-22 06:23:04 +02:00

55 lines
1.5 KiB
TypeScript

import { defineConfig, devices } from '@playwright/test'
/**
* Playwright fuer die kritischen Ablaeufe.
*
* Zwei Geraete, weil die Anwendung am Handy vollwertig bedienbar sein muss -
* das ist kein Zusatz, sondern Anforderung: Ich sitze oft im Heim oder auf
* dem Amt und habe nur das Telefon dabei.
*
* Der Server wird nicht automatisch gestartet: die Tests brauchen eine
* eingerichtete Datenbank mit Demodaten. Vorher einmal:
*
* docker compose -f docker-compose.dev.yml up -d
* npm run db:migrate && npm run db:sql
* SEED_DEMO=true npm run db:seed
* npm run dev
*/
const BASIS = process.env.E2E_BASIS ?? 'http://localhost:3300'
export default defineConfig({
testDir: './e2e',
// Anmeldung, Uploads und PDF-Erzeugung brauchen Zeit.
timeout: 90_000,
expect: { timeout: 15_000 },
// Die Tests teilen sich eine Datenbank und legen Daten an - parallel
// wuerden sie sich gegenseitig die Zaehlungen verderben.
fullyParallel: false,
workers: 1,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 1 : 0,
reporter: process.env.CI ? [['list'], ['html', { open: 'never' }]] : [['list']],
use: {
baseURL: BASIS,
locale: 'de-DE',
timezoneId: 'Europe/Berlin',
trace: 'retain-on-failure',
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},
projects: [
{
name: 'schreibtisch',
use: { ...devices['Desktop Chrome'], viewport: { width: 1440, height: 900 } },
},
{
name: 'handy',
use: { ...devices['Pixel 7'] },
},
],
})