import { describe, expect, it } from "vitest"; import { z } from "@/lib/validierung"; import { AustauschSchema, StrukturSchema, stelleBenennen } from "@/lib/vorlagen-format"; /** * Zod ist in src/lib/validierung.ts auf Deutsch eingestellt (#009). * * Ohne diese Einstellung landen englische Standardsaetze ueber die Server * Actions in der Oberflaeche — und zwar genau dort, wo niemand an eine eigene * Meldung gedacht hat. */ describe("Deutsche Meldungen", () => { it("meldet einen falschen Typ auf Deutsch", () => { const ergebnis = z.object({ name: z.string() }).safeParse({ name: 42 }); expect(ergebnis.error?.issues[0]?.message).toMatch(/Ungültige Eingabe/); }); it("meldet ein fehlendes Pflichtfeld auf Deutsch", () => { const ergebnis = z.object({ name: z.string() }).safeParse({}); expect(ergebnis.error?.issues[0]?.message).not.toMatch(/Invalid input/); }); it("laesst eigene Meldungen unangetastet", () => { const ergebnis = StrukturSchema.safeParse({ abschnitte: [{ titel: "A", schritte: [{ titel: "" }] }], }); expect(ergebnis.error?.issues[0]?.message).toBe("Ein Schritt braucht einen Titel."); }); it("meldet ein unbekanntes Austauschformat auf Deutsch", () => { const ergebnis = AustauschSchema.safeParse({ format: 99, name: "X", struktur: {} }); expect(ergebnis.error?.issues[0]?.message).toMatch(/Unbekanntes Format/); }); }); describe("Stelle benennen", () => { it("macht aus einem Zod-Pfad eine Stelle im Editor", () => { expect(stelleBenennen(["struktur", "abschnitte", 2, "schritte", 0, "titel"])).toBe( "Abschnitt 03, Schritt 1: ", ); expect(stelleBenennen(["variablen", 1, "schluessel"])).toBe("Variable 2: "); expect(stelleBenennen(["abschnitte", 0, "schritte", 3, "konfig", "optionen", 1])).toBe( "Abschnitt 01, Schritt 4, Option 2: ", ); }); it("liefert nichts, wenn der Pfad keine Stelle beschreibt", () => { // Dann bleibt die Meldung des Schemas fuer sich allein stehen – besser als // ein leerer Doppelpunkt davor. expect(stelleBenennen(["name"])).toBe(""); expect(stelleBenennen([])).toBe(""); }); it("nennt die Stelle in der Reihenfolge, in der man sie sucht", () => { // Erst der Abschnitt, dann der Schritt darin – nicht umgekehrt. const stelle = stelleBenennen(["abschnitte", 9, "schritte", 11, "titel"]); expect(stelle.indexOf("Abschnitt")).toBeLessThan(stelle.indexOf("Schritt")); expect(stelle).toBe("Abschnitt 10, Schritt 12: "); }); });