import { describe, expect, test } from "bun:test"; import { isValidProjectColor, sanitizeHexColor } from "./color"; describe("sanitizeHexColor", () => { test("accepts strict hex colors (3/4/6/8 digits, any case)", () => { for (const value of ["#fff", "#FFFF", "#22d3ee", "#000000ff", "#AbCdEf"]) { expect(sanitizeHexColor(value)).toBe(value); } }); test("trims surrounding whitespace on a valid hex", () => { expect(sanitizeHexColor(" #22d3ee ")).toBe("#22d3ee"); }); test("fails closed (undefined) for non-hex / poisoned values", () => { for (const value of [ "red", "red; color: evil", "red;}", "rgb(1,2,3)", "var(--evil)", "#xyz", "#12", "", null, undefined, ]) { expect(sanitizeHexColor(value)).toBeUndefined(); } }); test("returns the provided fallback for invalid values", () => { expect(sanitizeHexColor("red; color: evil", "var(--rep-muted)")).toBe( "var(--rep-muted)", ); expect(sanitizeHexColor(null, "#000")).toBe("#000"); }); }); describe("isValidProjectColor", () => { test("accepts hex colors", () => { for (const value of ["#fff", "#FFFF", "#22d3ee", "#000000ff", "#AbCdEf"]) { expect(isValidProjectColor(value)).toBe(true); } }); test("accepts numeric oklch() colors (the palette format)", () => { for (const value of [ "oklch(0.6 0.15 137)", "oklch(0.55 0.02 260)", "oklch(0.6 0.15 137.508)", "oklch(60% 0.15 137)", "oklch(0.6 0.15 137 / 0.5)", " oklch(0.6 0.15 137) ", ]) { expect(isValidProjectColor(value)).toBe(true); } }); test("rejects non-color / CSS-breakout / non-string values", () => { for (const value of [ "red", "red; color: evil", "red;}", "rgb(1,2,3)", "var(--evil)", "oklch(0.6 0.15 137); color: evil", "oklch(0.7 var(--accent-sat) var(--accent-hue))", "#xyz", "", null, undefined, 42, ]) { expect(isValidProjectColor(value)).toBe(false); } }); });