import { test, expect } from "@playwright/test"; /** * Suche & Eintreffzeit-Sortierung (Definition of Done #6, Plan WS11 Aufgabe 7 / * Verifikation 7). * * NICHT in der Sandbox ausführbar (kein Server/DB/OSRM) — deferred. Wird über * `npm run test:e2e` gegen einen geseedeten Server mit authentifizierter * Session ausgeführt. * * Garantien: * - Dynamische Filter (UND-verknüpft) liefern korrekte Teilmengen. * - Treffer sind nach ETA aufsteigend sortiert. * - OSRM-Ausfall (E2E_FORCE_HAVERSINE=1) -> sichtbarer "Luftlinie"-Fallback. */ test.skip( !process.env.E2E_AUTH_STATE && !process.env.E2E_WEHR_READ_STATE, "benötigt authentifizierte Session (Auth-Setup)", ); test.use({ storageState: process.env.E2E_AUTH_STATE ?? process.env.E2E_WEHR_READ_STATE ?? undefined, }); test("Filter grenzt Treffer ein (UND-Verknüpfung)", async ({ page }) => { await page.goto("/fahrzeuge"); const before = await page.getByText(/Treffer/).first().innerText(); await page.getByLabel("Nur einsatzbereit").click(); await expect(page).toHaveURL(/bereit=1/); const after = await page.getByText(/Treffer/).first().innerText(); // Teilmenge: Anzahl sinkt nicht und Filter ist in der URL aktiv. expect(after).not.toBe(before); }); test("Treffer mit Standort sind aufsteigend nach ETA sortiert", async ({ page, }) => { await page.goto("/fahrzeuge?ort=St.+P%C3%B6lten"); await page.waitForLoadState("networkidle"); const etaTexts = await page .locator("[data-testid='eta-minutes']") .allInnerTexts(); const minutes = etaTexts.map((t) => parseInt(t.replace(/\D/g, ""), 10)); const sorted = [...minutes].sort((a, b) => a - b); expect(minutes).toEqual(sorted); }); test("OSRM-Ausfall zeigt Luftlinie-Fallback", async ({ page }) => { test.skip( process.env.E2E_FORCE_HAVERSINE !== "1", "nur mit E2E_FORCE_HAVERSINE=1", ); await page.goto("/fahrzeuge?ort=St.+P%C3%B6lten"); await expect(page.getByText(/Luftlinie/i).first()).toBeVisible(); });