import { readdirSync, 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. // // Gelesen werden **alle** Migrationen, nicht eine bestimmte. Hier stand // einmal ein fester Dateiname mit dem Vermerk „die zuletzt gültige Fassung"; // der war schon zwei Migrationen später falsch, und ein Teil der Feldkarte // kommt inzwischen ohnehin aus einer Punktänderung an der laufenden // Definition statt aus einer vollständigen Fassung. Eine Bezeichnung, die // irgendwann einmal eingetragen wurde, zählt damit als bekannt — das ist // schwächer als der Stand von heute, aber es ist die Frage, die hier zählt: // ob jemand einen Schlüssel erfunden hat, den es nie gab. const MIGRATIONEN = join(process.cwd(), "db/migrations"); function bezeichnungenDerFeldkarte(): string[] { // Je Zeile: 'Bezeichnung', jsonb_build_array('spalte', 'typ', 'gruppe'), const muster = /'([^']+)',\s+jsonb_build_array\('[a-z_]+', '[a-z_]+'/g; const gefunden = readdirSync(MIGRATIONEN) .filter((f) => f.endsWith(".sql")) .flatMap((f) => [...readFileSync(join(MIGRATIONEN, f), "utf8").matchAll(muster)].map((m) => m[1])); expect(gefunden.length, "Die Feldkarte steht in keiner Migration mehr").toBeGreaterThan(0); return gefunden; } 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(); } }); });