import { readFileSync } from "node:fs"; import { join } from "node:path"; import { describe, expect, it } from "vitest"; import { FELD_AUSWAHLEN, auswahlFuer } from "@/lib/historie-felder"; // Die Schlüssel sind Bezeichnungen aus `app_feld_karte()`. Stimmt eine nicht // mehr — umbenannt, vertippt —, fällt das nirgends auf: das Feld bliebe im // Dialog „Eintrag berichtigen" einfach ein Textfeld, und getippte Werte // landeten wieder in der Spalte. Ein stiller Rückfall auf den Zustand, den // diese Datei beheben soll. // // Geprüft wird gegen die zuletzt gültige Fassung der Feldkarte. const MIGRATION = join(process.cwd(), "db/migrations/20260923120000_firmenemail.sql"); function bezeichnungenDerFeldkarte(): string[] { const sql = readFileSync(MIGRATION, "utf8"); const block = sql.match(/FUNCTION public\.app_feld_karte\(\)[\s\S]*?\$function\$;/)?.[0]; expect(block, "app_feld_karte steht nicht mehr in dieser Migration").toBeDefined(); // Je Zeile: 'Bezeichnung', jsonb_build_array('spalte', 'typ', 'gruppe'), return [...block!.matchAll(/^\s*'([^']+)',\s+jsonb_build_array\(/gm)].map((m) => m[1]); } describe("Die Auswahllisten im Dialog „Eintrag berichtigen“", () => { it("nennen nur Felder, die es in der Feldkarte gibt", () => { const bekannt = new Set(bezeichnungenDerFeldkarte()); expect(bekannt.size).toBeGreaterThan(30); for (const feld of Object.keys(FELD_AUSWAHLEN)) { expect(bekannt, `„${feld}“ steht nicht in app_feld_karte()`).toContain(feld); } }); it("bieten für das Verhältnis des Notfallkontakts eine Liste an", () => { // Der gemeldete Fall: dort liess sich freier Text eintragen, während die // Erfassung überall sonst eine Liste führt. expect(auswahlFuer("Notfallkontakt Verhältnis")).toContain("Gattin/Gatte"); expect(auswahlFuer("Notfallkontakt Verhältnis")).toContain("Tochter"); }); it("lassen Felder ohne feste Liste als Textfeld stehen", () => { expect(auswahlFuer("Adresse")).toBeUndefined(); expect(auswahlFuer("Wochenstunden")).toBeUndefined(); }); it("führen keine Felder mit Aufzählungstyp", () => { // Dort ist der gespeicherte Wert nicht die Anzeige (`m`/`w`, // `true`/`false`). Eine Liste, die die Anzeigeform schreibt, liefe in // einen Umwandlungsfehler oder in einen stillen Fehlwert. for (const feld of ["Geschlecht", "Beschäftigungsausmaß", "Vertragsart", "Besetzungsart", "Betriebsrat"]) { expect(auswahlFuer(feld), `„${feld}“ gehört nicht in die Auswahl`).toBeUndefined(); } }); });