import { describe, expect, it } from "vitest"; import { BLAETTER } from "@/lib/import/schema"; import { AUSWAHL_KRITERIEN, parseCriteria } from "@/lib/report-criteria"; import { GROUP_LABELS } from "@/lib/reports"; // Die Beschäftigtengruppe (worker_type) steht an vier Stellen als Liste: // im Datenbank-Enum, in der Auswahl der Auswertungen, in der Prüfliste des // Imports und im Auswahlfeld der Oberfläche. Sie werden von Hand gepflegt, // und sie driften auseinander, ohne dass etwas rot wird — ein fehlender Wert // heisst dort nicht „Fehler", sondern „gibt es nicht": // // * fehlt er in der Auswertung, lässt sich nach der Gruppe nicht filtern, // * fehlt er im Import, wird die Zeile abgewiesen, // * fehlt er im Auswahlfeld, ist der Wert nicht einzugeben. // // Deshalb steht die erwartete Liste hier einmal, und jede Stelle wird // dagegen gehalten. Das Enum selbst prüft die Migration (20260910140000). const GRUPPEN = ["Angestellte:r", "Arbeiter:in", "Lehrling"]; function importSpalte() { for (const blatt of BLAETTER) { const treffer = blatt.spalten.find((s) => s.ziel === "worker_type"); if (treffer) return treffer; } throw new Error("Keine Importspalte mit ziel worker_type gefunden"); } describe("Beschäftigtengruppe", () => { it("bietet in den Auswertungen alle drei zur Auswahl", () => { const kriterium = AUSWAHL_KRITERIEN.find((k) => k.key === "worker"); expect(kriterium?.optionen.map((o) => o.wert)).toEqual(GRUPPEN); }); it("lässt jede der drei durch die Prüfung der Adresszeile", () => { // Was nicht in der Liste steht, verwirft parseCriteria stillschweigend — // der Filter wirkte dann einfach nicht, ohne Meldung. for (const gruppe of GRUPPEN) { expect(parseCriteria((k) => (k === "worker" ? gruppe : undefined)).auswahl).toEqual({ worker: gruppe }); } }); it("verwirft weiterhin, was nicht dazugehört", () => { // Die Werte landen in SQL-Vergleichen und im Dateinamen des Downloads. expect(parseCriteria((k) => (k === "worker" ? "Lehrling'; drop table employees; --" : undefined)).auswahl).toEqual({}); }); it("nimmt alle drei im Import an", () => { const spalte = importSpalte(); expect(spalte.typ).toMatchObject({ art: "auswahl", werte: GRUPPEN }); }); it("nennt das Feld überall Beschäftigtengruppe", () => { // Bis September 2026 hiess es „Angestellte:r / Arbeiter:in" — ein Name // aus seinen beiden Werten, der mit dem dritten falsch wurde. expect(AUSWAHL_KRITERIEN.find((k) => k.key === "worker")?.label).toBe("Beschäftigtengruppe"); expect(GROUP_LABELS.worker_type).toBe("Beschäftigtengruppe"); expect(importSpalte().name).toBe("Beschäftigtengruppe"); }); });