File size: 2,191 Bytes
9de795a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/** Farb-System (Welle 3): Schema-Deckung + Auflösungs-Rangfolge.
 *
 * Drift-Schutz: die Slug→Hex-Map muss EXAKT das Schema-Enum abdecken
 * (`katalog-item.schema.json#/$defs/farbSlug`) – kommt ein Slug dazu/weg, ohne
 * die Map zu pflegen, schlägt dieser Test an (analog zum MATERIAL_SLUGS-Laufzeit-
 * Read in kurator.py).
 */
import { describe, expect, it } from "vitest";
import katalogSchema from "../../../packages/shared/schemas/katalog-item.schema.json";
import { FARBSLUG_HEX, FARBSLUGS, farbHex, loeseFarbSlug } from "./farben";

const SCHEMA_ENUM = (katalogSchema as { $defs: { farbSlug: { enum: string[] } } }).$defs.farbSlug
  .enum;

describe("FARBSLUG_HEX deckt das Schema-Enum", () => {
  it("hat exakt dieselben Slugs wie farbSlug im Schema", () => {
    expect([...FARBSLUGS].sort()).toEqual([...SCHEMA_ENUM].sort());
  });

  it("liefert für jeden Slug einen #rrggbb-Hex", () => {
    for (const slug of SCHEMA_ENUM) {
      expect(FARBSLUG_HEX[slug as keyof typeof FARBSLUG_HEX]).toMatch(/^#[0-9a-f]{6}$/i);
    }
  });

  it("farbHex fällt bei unbekanntem Slug sauber zurück", () => {
    expect(farbHex("gibt-es-nicht")).toBe("#cccccc");
    expect(farbHex(null)).toBe("#cccccc");
    expect(farbHex("salbei")).toBe(FARBSLUG_HEX.salbei);
  });
});

describe("loeseFarbSlug – Rangfolge MANUELL > KI > Default", () => {
  const varianten = ["hellgrau", "schwarz"] as const;

  it("nimmt den manuellen Override vor allem anderen", () => {
    expect(loeseFarbSlug(varianten, "schwarz", "salbei")).toBe("salbei");
  });

  it("nimmt die KI-Farbe, wenn kein Override gesetzt ist", () => {
    expect(loeseFarbSlug(varianten, "schwarz", null)).toBe("schwarz");
  });

  it("fällt auf die erste Variante (Default) zurück", () => {
    expect(loeseFarbSlug(varianten, null, null)).toBe("hellgrau");
  });

  it("liefert undefined ohne Varianten und ohne Override", () => {
    expect(loeseFarbSlug(undefined, null, null)).toBeUndefined();
    expect(loeseFarbSlug([], null, null)).toBeUndefined();
  });

  it("ignoriert unbekannte Slugs (Erdung liegt beim Kurator)", () => {
    expect(loeseFarbSlug(varianten, "gibt-es-nicht", null)).toBeUndefined();
  });
});