import { describe, expect, test } from "bun:test"; import { createAbortController, createChildAbortController, } from "../abortController"; describe("createAbortController", () => { test("returns an AbortController that is not aborted", () => { const controller = createAbortController(); expect(controller.signal.aborted).toBe(false); }); test("aborting the controller sets signal.aborted", () => { const controller = createAbortController(); controller.abort(); expect(controller.signal.aborted).toBe(true); }); test("abort reason is propagated", () => { const controller = createAbortController(); controller.abort("custom reason"); expect(controller.signal.reason).toBe("custom reason"); }); test("accepts custom maxListeners without error", () => { const controller = createAbortController(100); expect(controller.signal.aborted).toBe(false); }); }); describe("createChildAbortController", () => { test("child is not aborted initially", () => { const parent = createAbortController(); const child = createChildAbortController(parent); expect(child.signal.aborted).toBe(false); expect(parent.signal.aborted).toBe(false); }); test("parent abort propagates to child", () => { const parent = createAbortController(); const child = createChildAbortController(parent); parent.abort("parent reason"); expect(child.signal.aborted).toBe(true); expect(child.signal.reason).toBe("parent reason"); }); test("child abort does NOT propagate to parent", () => { const parent = createAbortController(); const child = createChildAbortController(parent); child.abort("child reason"); expect(child.signal.aborted).toBe(true); expect(parent.signal.aborted).toBe(false); }); test("already-aborted parent immediately aborts child", () => { const parent = createAbortController(); parent.abort("pre-abort"); const child = createChildAbortController(parent); expect(child.signal.aborted).toBe(true); expect(child.signal.reason).toBe("pre-abort"); }); test("multiple children are independent", () => { const parent = createAbortController(); const child1 = createChildAbortController(parent); const child2 = createChildAbortController(parent); child1.abort("child1"); expect(child1.signal.aborted).toBe(true); expect(child2.signal.aborted).toBe(false); // Aborting child1 did not affect child2 or parent expect(parent.signal.aborted).toBe(false); }); test("parent abort propagates to all children", () => { const parent = createAbortController(); const child1 = createChildAbortController(parent); const child2 = createChildAbortController(parent); parent.abort("all go down"); expect(child1.signal.aborted).toBe(true); expect(child2.signal.aborted).toBe(true); }); test("grandchild abort propagation", () => { const grandparent = createAbortController(); const parent = createChildAbortController(grandparent); const child = createChildAbortController(parent); grandparent.abort("chain"); expect(parent.signal.aborted).toBe(true); expect(child.signal.aborted).toBe(true); }); test("child abort then parent abort — child stays aborted with original reason", () => { const parent = createAbortController(); const child = createChildAbortController(parent); child.abort("child first"); parent.abort("parent later"); expect(child.signal.reason).toBe("child first"); expect(parent.signal.reason).toBe("parent later"); }); test("accepts custom maxListeners for child", () => { const parent = createAbortController(); const child = createChildAbortController(parent, 200); expect(child.signal.aborted).toBe(false); }); });