Schnellerfassung im Alarmfall, sechs Zeitstempel mit Ausrueckzeit, Anfahrt und Hilfsfrist, Staerke nach FwDV 3, Personalvorschlag mit Qualifikationsstand, Einsatzbericht als PDF, Jahresexport fuer die Gemeinde, Statistik und Uebungen mit Anwesenheitsliste. Dazu das Einsatzportal fuer Fremdwehren: ein signierter Link ohne Anmeldung, zeitlich und mengenbegrenzt, der Stichwort, Ort, Zeiten und Lagemeldungen zeigt und Meldungen mit Foto annimmt. Es sind die ersten oeffentlich erreichbaren Endpunkte in FLORIAN. Acht neue Tabellen, alle mit organisationId und Row Level Security. Ein freigegebener Einsatzbericht ist unveraenderlich; ein Datenbanktrigger setzt das durch. Koordinaten liegen doppelt — als Dezimalgrad und als PostGIS-Punkt, zusammengehalten von einem Trigger. 57 neue Tests (32 Unit, 14 gegen eine echte Datenbank, 11 E2E). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
63 lines
2.2 KiB
TypeScript
63 lines
2.2 KiB
TypeScript
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,
|
|
},
|
|
});
|