Der Integrationstest prüft gegen eine echte Datenbank, was Vitest nicht
sieht: Eindeutigkeit, Fremdschlüssel, Kaskaden und dass das Protokoll den
gelöschten Benutzer überlebt. Er läuft bewusst ohne umschließende
Transaktion — er prüft absichtlich Fälle, die scheitern müssen, und ein
gescheiterter Befehl bricht in PostgreSQL die ganze Transaktion ab.
Stattdessen tragen alle Testdaten dieselbe Kennung und werden am Ende
wieder entfernt.
Der Migrationstest legt eine Wegwerf-Datenbank an, spielt alle
Migrationen ein und vergleicht das Ergebnis mit dem Schema. Dass er
Abweichungen wirklich bemerkt, wurde mit einem probeweise ergänzten Feld
nachgewiesen.
Der E2E-Rauchtest deckt den Weg ab, der in M1 trägt: Umleitung ohne
Anmeldung samt gemerktem Ziel, Abweisung falscher Zugangsdaten,
erfolgreiche Anmeldung und die Verwaltungsseite.
Dafür neu: eine Middleware, die nur den angefragten Pfad als Kopfzeile
durchreicht. Ein Layout kennt seinen Pfad nicht, braucht ihn aber für die
Rückkehr nach der Anmeldung. Anmeldelogik steht dort bewusst nicht — die
Middleware läuft im Edge-Umfeld ohne Prisma.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Next 16 mit App Router und standalone-Ausgabe, React 19, TypeScript strict,
Tailwind 4, Vitest und Playwright. Alle Versionen exakt gepinnt.
Abweichungen vom ursprünglich notierten Stand, jeweils begründet:
- Prisma 7.10.0 statt 6, weil 6 überholt ist und 8 nur als RC vorliegt.
- TypeScript 6.0.3 statt 7, weil typescript-eslint 8 nur "<6.1.0" trägt.
- ESLint 9.39.5 statt 10, weil das in eslint-config-next gebündelte
eslint-plugin-react noch context.getFilename() benutzt.
- npm-overrides für SimpleWebAuthn und nodemailer, weil next-auth dort
ältere optionale Peers deklariert. Die betroffenen next-auth-Provider
werden nicht benutzt: Passkeys laufen direkt über SimpleWebAuthn 14.
"npm run pruefen" bündelt Prettier, ESLint, tsc, Vitest und ShellCheck.
ShellCheck läuft über das Docker-Abbild, wenn es lokal fehlt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>