import { defineConfig, devices } from "@playwright/test"; /** * End-to-End-Tests. * * Voraussetzung: der Stack läuft (docker compose up -d) und die Datenbank ist * migriert und geseedet. Der Entwicklungsserver wird bei Bedarf selbst * gestartet — ein bereits laufender wird wiederverwendet. */ const BASIS_URL = process.env.E2E_BASIS_URL ?? "http://localhost:3100"; export default defineConfig({ testDir: "./tests/e2e", fullyParallel: true, forbidOnly: Boolean(process.env.CI), retries: process.env.CI ? 2 : 0, /** * Bewusst wenige Worker: "next dev" übersetzt jede Route erst beim ersten * Aufruf. Zu viele gleichzeitige Erstaufrufe lassen den Server so lange * kompilieren, dass die Navigation ins Zeitlimit läuft — und das sieht dann * nach einem Fehler in der Anwendung aus, ist aber keiner. */ workers: process.env.CI ? 1 : 4, reporter: process.env.CI ? [["list"], ["html", { open: "never" }]] : [["list"]], /** Großzügig, aus demselben Grund. Gegen einen Produktionsbuild reicht ein Bruchteil. */ timeout: 90_000, /** * Ab Phase 3 großzügiger: mit fünfzig Routen dauert die erste Übersetzung * einer bisher unbesuchten Seite unter Last auch mal zwanzig Sekunden. Das * sind Wartezeiten des Entwicklungsservers, keine der Anwendung — vorher * schlugen dadurch gelegentlich Tests fehl, die einzeln laufen und grün sind. */ expect: { timeout: 25_000 }, use: { baseURL: BASIS_URL, trace: "on-first-retry", screenshot: "only-on-failure", video: "retain-on-failure", // Die Oberfläche ist durchgängig deutsch — auch der Browser soll es sein. locale: "de-DE", timezoneId: "Europe/Berlin", }, projects: [ { name: "chromium", use: { ...devices["Desktop Chrome"] } }, // Am Terminal im Gerätehaus steht ein Touchgerät — deshalb mitgetestet. // Bewusst mit Chromium statt WebKit: das Terminal läuft auf einem // Android-Tablet im Kiosk-Browser, nicht auf einem iPad. { name: "tablet", use: { ...devices["Galaxy Tab S4 landscape"], browserName: "chromium" }, }, ], webServer: { command: "npm run dev", url: BASIS_URL, reuseExistingServer: !process.env.CI, timeout: 180_000, }, });