Files
Florian-netz/tests/e2e/verwaltung-fuhrpark.spec.ts
Matthias Hochmeister 632ba2b081 fix(verwaltung): BLOCKING-Befunde Fuhrpark & Benutzer beheben
- tests/e2e/verwaltung-fuhrpark.spec.ts: selectOption({ label: /HLF 2/ })
  uebergab eine RegExp an Playwrights string-typisierte label-Option
  (TS2345 -> tsc-Gate rot). Stattdessen erste echte Vorlage per
  { index: 1 } waehlen (Index 0 ist "Ohne Vorlage (frei)"). tsc clean.

- src/lib/validation/vehicle.ts: Pflichtmerkmale wurden nur pro Element
  geprueft; ein komplett ausgelassenes Pflichtmerkmal (z.B. []) entging
  der Validierung. buildMerkmalValuesSchema prueft jetzt auf Array-Ebene
  per superRefine, dass jede pflicht-Definition einen gesetzten,
  typgerechten, nicht-leeren Wert hat ("validieren, nicht vertrauen",
  Querschnittsstandard 4). Tests ergaenzt (TDD).

- src/server/actions/brigade.ts: bei fehlgeschlagenem Geocoding
  (geo.status !== "ok") werden lat/lng nun auf null gesetzt, analog zu
  createBrigadeWithFirstAdmin, damit keine veralteten Koordinaten
  zuruechbleiben (WS4-Konsistenz).

Verifikation offline: tsc --noEmit exit 0; vitest src/lib/validation
47/47 gruen. E2E (DB/Server) deferred (kein Postgres/Server im Sandbox).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-09 11:18:31 +02:00

65 lines
2.7 KiB
TypeScript

import { test, expect } from "@playwright/test";
/**
* Happy-Path des Wehr-Bereichs: Fuhrpark, Geräte, Profil, Benutzer
* (Workstream 7).
*
* NICHT in der Sandbox ausführbar (kein Server/DB) — deferred. Erwartet einen
* angemeldeten `wehr_admin` (Fixture aus dem Test-Workstream) und befüllte
* Taxonomie (Seed/Admin).
*/
test.describe("Verwaltung: Fuhrpark & Benutzer (Happy-Path)", () => {
test.skip(
!process.env.E2E_WEHR_ADMIN_STATE,
"benötigt wehr_admin-Fixture (Test-Workstream)",
);
test.use({
storageState: process.env.E2E_WEHR_ADMIN_STATE ?? { cookies: [], origins: [] },
});
test("Fahrzeug per Vorlage anlegen befüllt typisierte Merkmale", async ({
page,
}) => {
await page.goto("/verwaltung/fahrzeuge/neu");
// Erste echte Vorlage wählen (Index 0 ist „Ohne Vorlage (frei)").
await page.getByLabel("Fahrzeug-Vorlage").selectOption({ index: 1 });
// Vorlagen-Merkmale werden nachgeladen (Löschwassertank, Feuerlöschpumpe …).
await expect(page.getByText("Löschwassertank")).toBeVisible();
await page.getByLabel("Name").fill("HLF 2 Musterdorf");
await page.getByRole("button", { name: "Speichern" }).click();
await expect(page).toHaveURL(/\/verwaltung\/fahrzeuge$/);
await expect(page.getByText("HLF 2 Musterdorf")).toBeVisible();
});
test("Gerät 'im Gerätehaus' anlegen (keine Fahrzeug-Zuordnung)", async ({
page,
}) => {
await page.goto("/verwaltung/geraete/neu");
await page.getByLabel("Name").fill("Tragkraftspritze 1");
await page.getByLabel("Kategorie").selectOption({ index: 1 });
// Zuordnung bleibt auf 'im Gerätehaus'.
await page.getByRole("button", { name: "Speichern" }).click();
await expect(page).toHaveURL(/\/verwaltung\/geraete$/);
await expect(page.getByText("im Gerätehaus").first()).toBeVisible();
});
test("Profil speichern zeigt Bestätigung", async ({ page }) => {
await page.goto("/verwaltung/profil");
await page.getByLabel("Straße").fill("Hauptstraße 1");
await page.getByLabel("PLZ").fill("3100");
await page.getByLabel("Ort").fill("St. Pölten");
await page.getByRole("button", { name: "Speichern" }).click();
await expect(page.getByText(/gespeichert|geokodiert|geokodiert werden/)).toBeVisible();
});
test("Benutzer anlegen zeigt Einmal-Passwort", async ({ page }) => {
await page.goto("/verwaltung/benutzer");
await page.getByLabel("Name").fill("Neue Person");
await page.getByLabel("E-Mail").fill("neu@ff-musterdorf.at");
await page.getByLabel("Rolle").selectOption("wehr_read");
await page.getByRole("button", { name: "Benutzer anlegen" }).click();
await expect(page.getByText(/Einmal-Passwort/)).toBeVisible();
});
});