import { describe, expect, test } from "bun:test"; import { safeSerialize } from "../lib/serialization.ts"; describe("safeSerialize", () => { test("serializes simple objects", () => { const obj = { name: "test", value: 123 }; const result = safeSerialize(obj); expect(JSON.parse(result)).toEqual(obj); }); test("serializes nested objects", () => { const obj = { level1: { level2: { value: "deep", }, }, }; const result = safeSerialize(obj); expect(JSON.parse(result)).toEqual(obj); }); test("serializes arrays", () => { const arr = [1, 2, { nested: true }]; const result = safeSerialize(arr); expect(JSON.parse(result)).toEqual(arr); }); test("handles circular references", () => { const obj: Record = { name: "test" }; obj.self = obj; // Circular reference const result = safeSerialize(obj); const parsed = JSON.parse(result); expect(parsed.name).toBe("test"); expect(parsed.self).toBe("[Circular]"); }); test("handles functions", () => { const obj = { name: "test", execute: () => "result", }; const result = safeSerialize(obj); const parsed = JSON.parse(result); expect(parsed.name).toBe("test"); expect(parsed.execute).toBe("[Function]"); }); test("handles Error objects", () => { const error = new Error("Test error"); const obj = { error }; const result = safeSerialize(obj); const parsed = JSON.parse(result); expect(parsed.error.name).toBe("Error"); expect(parsed.error.message).toBe("Test error"); expect(parsed.error.stack).toBeDefined(); }); test("handles null and undefined", () => { const obj = { nullValue: null, undefinedValue: undefined, }; const result = safeSerialize(obj); const parsed = JSON.parse(result); expect(parsed.nullValue).toBeNull(); expect(parsed.undefinedValue).toBeUndefined(); }); test("handles primitives directly", () => { expect(safeSerialize("string")).toBe('"string"'); expect(safeSerialize(123)).toBe("123"); expect(safeSerialize(true)).toBe("true"); expect(safeSerialize(null)).toBe("null"); }); });