import { test, expect } from "@playwright/test"; /** * Rollen-/Wehr-Scoping (Definition of Done #3, Plan WS11 Aufgabe 6 / Verifikation * 6). * * NICHT in der Sandbox ausführbar (kein Server/DB) — deferred. Wird über * `npm run test:e2e` gegen einen geseedeten Server mit Storage-States aus dem * Auth-Setup ausgeführt. * * Garantien: * - wehr_read kann NICHT schreiben (Status-Änderung -> 403/forbidden). * - wehr_admin A kann Wehr B NICHT ändern (fremdes Asset -> 403/404, * Datensatz bleibt unverändert). * - eigene Ressource: wehr_admin A kann Status setzen (-> 200, status='wartung'). * * Storage-States kommen aus tests/e2e/fixtures/auth.setup.ts. Feste Asset-UUIDs * stammen aus dem deterministischen Seed (global-setup.ts). */ const VEHICLE_A = process.env.E2E_VEHICLE_A_ID ?? ""; const VEHICLE_B = process.env.E2E_VEHICLE_B_ID ?? ""; test.describe("wehr_read darf nicht schreiben", () => { test.skip(!process.env.E2E_WEHR_READ_STATE, "benötigt wehr_read-Fixture"); test.use({ storageState: process.env.E2E_WEHR_READ_STATE }); test("Aufruf der Verwaltungs-Schreibseite -> 403", async ({ page }) => { const res = await page.goto("/verwaltung/fahrzeuge/neu"); expect(res?.status()).toBe(403); }); }); test.describe("wehr_admin A darf Wehr B nicht ändern", () => { test.skip( !process.env.E2E_WEHR_ADMIN_STATE || !VEHICLE_B, "benötigt wehr_admin-A-Fixture + Wehr-B-Fahrzeug-ID", ); test.use({ storageState: process.env.E2E_WEHR_ADMIN_STATE }); test("fremdes Fahrzeug (Wehr B) -> 404, unverändert", async ({ page }) => { const res = await page.goto(`/verwaltung/fahrzeuge/${VEHICLE_B}`); expect(res?.status()).toBe(404); }); }); test.describe("wehr_admin A darf eigenes Fahrzeug ändern", () => { test.skip( !process.env.E2E_WEHR_ADMIN_STATE || !VEHICLE_A, "benötigt wehr_admin-A-Fixture + Wehr-A-Fahrzeug-ID", ); test.use({ storageState: process.env.E2E_WEHR_ADMIN_STATE }); test("eigenes Fahrzeug ist erreichbar (200) und editierbar", async ({ page, }) => { const res = await page.goto(`/verwaltung/fahrzeuge/${VEHICLE_A}`); expect(res?.status()).toBeLessThan(400); // Status auf 'wartung' setzen (Verifikation 6: eigenes -> 200). await page.getByLabel(/Status/i).selectOption("wartung"); await page.getByRole("button", { name: /Speichern/i }).click(); await expect(page.getByText(/gespeichert|wartung/i)).toBeVisible(); }); });