Neun Kapitel unter docs/anleitung/ fuer Technik und Verwaltung, mit 35 Bildern aus `pnpm docs:screenshots` und einem Fehlerbehebungskapitel aus echten Meldungen. `pnpm docs:pdf` macht daraus 72 Seiten A4 — hell gedruckt, mit Deckblatt, Inhaltsverzeichnis und Seitenzahlen, ohne neue Abhaengigkeit. Die Ablaeufe pruefen ihre Voraussetzungen, bevor der erste startet: antwortet ein gebauter Stand, steht der Seed-Bestand, und liest der Server dieselbe Datenbank wie der Testprozess. Jeder Ablauf legt an, was er braucht, und raeumt es weg. Vier neue kommen dazu: Hauptablauf, Onboarding mit Vergleich der Zwischenablage, Rollen und 390 px auf achtzehn Seiten. Drei Fehler kamen dabei heraus. Das Projekt „handy" pruefte 412 px statt der verlangten 390. Ein angemeldeter Benutzer ohne Recht erfuhr nie, warum er abgewiesen wurde — die Meldung stand auf einer Seite, die ihn sofort weiterleitet; jetzt gibt es /kein-zugriff. Und der Verzeichnis-Ablauf schrieb die Attributzuordnung der ersten vorhandenen Quelle um, in einer echten Installation also der produktiven. 101 Ablaeufe in INTERN und 97 in DIENSTLEISTUNG, beide ohne Fehlschlag. Closes #18 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
43 lines
1.6 KiB
TypeScript
43 lines
1.6 KiB
TypeScript
import { defineConfig, devices } from "@playwright/test";
|
||
|
||
const APP_URL = process.env["E2E_APP_URL"] ?? "http://127.0.0.1:3000";
|
||
|
||
export default defineConfig({
|
||
testDir: "./tests/e2e",
|
||
/*
|
||
* Prueft vor dem ersten Ablauf, dass die Voraussetzungen stimmen: ein gebauter
|
||
* Stand antwortet, der Seed-Bestand steht, und der Server liest **dieselbe**
|
||
* Datenbank wie dieser Prozess. Ohne das faellt jede fehlende Voraussetzung
|
||
* erst mitten im Lauf auf — als Zeitablauf oder als „0 Treffer“ (#018).
|
||
*/
|
||
globalSetup: "./tests/e2e/global-setup.ts",
|
||
// Die Ablaeufe aendern gemeinsame Daten, deshalb nacheinander.
|
||
fullyParallel: false,
|
||
workers: 1,
|
||
forbidOnly: Boolean(process.env["CI"]),
|
||
retries: process.env["CI"] ? 1 : 0,
|
||
reporter: process.env["CI"] ? [["list"], ["html", { open: "never" }]] : "list",
|
||
use: {
|
||
baseURL: APP_URL,
|
||
trace: "retain-on-failure",
|
||
screenshot: "only-on-failure",
|
||
locale: "de-DE",
|
||
timezoneId: "Europe/Berlin",
|
||
colorScheme: "dark",
|
||
},
|
||
projects: [
|
||
{ name: "desktop", use: { ...devices["Desktop Chrome"], viewport: { width: 1440, height: 900 } } },
|
||
{
|
||
/*
|
||
* **390 px, nicht 412.** `devices["Pixel 7"]` ist 412 × 839; CLAUDE.md und
|
||
* das Abnahmekriterium nennen 390. Zweiundzwanzig Pixel sind kein
|
||
* Rundungsfehler — eine Seite, die bei 390 ausbricht, sieht bei 412
|
||
* tadellos aus. Jeder „trägt am Handy ohne horizontales Scrollen“-Test lief
|
||
* damit gegen eine Breite, die niemand verlangt hatte (#018).
|
||
*/
|
||
name: "handy",
|
||
use: { ...devices["Pixel 7"], viewport: { width: 390, height: 844 } },
|
||
},
|
||
],
|
||
});
|