sanitization.test.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { describe, expect, test } from "bun:test";
  2. import {
  3. partiallySanitizeUnicode,
  4. recursivelySanitizeUnicode,
  5. } from "../sanitization";
  6. // ─── partiallySanitizeUnicode ───────────────────────────────────────────
  7. describe("partiallySanitizeUnicode", () => {
  8. test("preserves normal ASCII text", () => {
  9. expect(partiallySanitizeUnicode("hello world")).toBe("hello world");
  10. });
  11. test("preserves CJK characters", () => {
  12. expect(partiallySanitizeUnicode("你好世界")).toBe("你好世界");
  13. });
  14. test("removes zero-width spaces", () => {
  15. expect(partiallySanitizeUnicode("hello\u200Bworld")).toBe("helloworld");
  16. });
  17. test("removes BOM", () => {
  18. expect(partiallySanitizeUnicode("\uFEFFhello")).toBe("hello");
  19. });
  20. test("removes directional formatting", () => {
  21. expect(partiallySanitizeUnicode("hello\u202Aworld")).toBe("helloworld");
  22. });
  23. test("removes private use area characters", () => {
  24. expect(partiallySanitizeUnicode("hello\uE000world")).toBe("helloworld");
  25. });
  26. test("handles empty string", () => {
  27. expect(partiallySanitizeUnicode("")).toBe("");
  28. });
  29. test("handles string with only dangerous characters", () => {
  30. const result = partiallySanitizeUnicode("\u200B\u200C\u200D\uFEFF");
  31. expect(result.length).toBeLessThanOrEqual(1); // ZWJ may survive NFKC
  32. });
  33. });
  34. // ─── recursivelySanitizeUnicode ─────────────────────────────────────────
  35. describe("recursivelySanitizeUnicode", () => {
  36. test("sanitizes string values", () => {
  37. expect(recursivelySanitizeUnicode("hello\u200Bworld")).toBe("helloworld");
  38. });
  39. test("sanitizes array elements", () => {
  40. const result = recursivelySanitizeUnicode(["a\u200Bb", "c\uFEFFd"]);
  41. expect(result).toEqual(["ab", "cd"]);
  42. });
  43. test("sanitizes object values recursively", () => {
  44. const result = recursivelySanitizeUnicode({
  45. key: "val\u200Bue",
  46. nested: { inner: "te\uFEFFst" },
  47. });
  48. expect(result).toEqual({ key: "value", nested: { inner: "test" } });
  49. });
  50. test("preserves numbers", () => {
  51. expect(recursivelySanitizeUnicode(42)).toBe(42);
  52. });
  53. test("preserves booleans", () => {
  54. expect(recursivelySanitizeUnicode(true)).toBe(true);
  55. });
  56. test("preserves null", () => {
  57. expect(recursivelySanitizeUnicode(null)).toBeNull();
  58. });
  59. });