import { describe, expect, test } from "bun:test"; import { partiallySanitizeUnicode, recursivelySanitizeUnicode, } from "../sanitization"; // ─── partiallySanitizeUnicode ─────────────────────────────────────────── describe("partiallySanitizeUnicode", () => { test("preserves normal ASCII text", () => { expect(partiallySanitizeUnicode("hello world")).toBe("hello world"); }); test("preserves CJK characters", () => { expect(partiallySanitizeUnicode("你好世界")).toBe("你好世界"); }); test("removes zero-width spaces", () => { expect(partiallySanitizeUnicode("hello\u200Bworld")).toBe("helloworld"); }); test("removes BOM", () => { expect(partiallySanitizeUnicode("\uFEFFhello")).toBe("hello"); }); test("removes directional formatting", () => { expect(partiallySanitizeUnicode("hello\u202Aworld")).toBe("helloworld"); }); test("removes private use area characters", () => { expect(partiallySanitizeUnicode("hello\uE000world")).toBe("helloworld"); }); test("handles empty string", () => { expect(partiallySanitizeUnicode("")).toBe(""); }); test("handles string with only dangerous characters", () => { const result = partiallySanitizeUnicode("\u200B\u200C\u200D\uFEFF"); expect(result.length).toBeLessThanOrEqual(1); // ZWJ may survive NFKC }); }); // ─── recursivelySanitizeUnicode ───────────────────────────────────────── describe("recursivelySanitizeUnicode", () => { test("sanitizes string values", () => { expect(recursivelySanitizeUnicode("hello\u200Bworld")).toBe("helloworld"); }); test("sanitizes array elements", () => { const result = recursivelySanitizeUnicode(["a\u200Bb", "c\uFEFFd"]); expect(result).toEqual(["ab", "cd"]); }); test("sanitizes object values recursively", () => { const result = recursivelySanitizeUnicode({ key: "val\u200Bue", nested: { inner: "te\uFEFFst" }, }); expect(result).toEqual({ key: "value", nested: { inner: "test" } }); }); test("preserves numbers", () => { expect(recursivelySanitizeUnicode(42)).toBe(42); }); test("preserves booleans", () => { expect(recursivelySanitizeUnicode(true)).toBe(true); }); test("preserves null", () => { expect(recursivelySanitizeUnicode(null)).toBeNull(); }); });