import { describe, expect, test } from "bun:test"; import { withResolvers } from "../withResolvers"; describe("withResolvers", () => { test("returns object with promise, resolve, reject", () => { const result = withResolvers(); expect(result).toHaveProperty("promise"); expect(result).toHaveProperty("resolve"); expect(result).toHaveProperty("reject"); expect(typeof result.resolve).toBe("function"); expect(typeof result.reject).toBe("function"); }); test("promise resolves when resolve is called", async () => { const { promise, resolve } = withResolvers(); resolve("hello"); const result = await promise; expect(result).toBe("hello"); }); test("promise rejects when reject is called", async () => { const { promise, reject } = withResolvers(); reject(new Error("fail")); await expect(promise).rejects.toThrow("fail"); }); test("resolve passes value through", async () => { const { promise, resolve } = withResolvers(); resolve(42); expect(await promise).toBe(42); }); test("reject passes error through", async () => { const { promise, reject } = withResolvers(); const err = new Error("custom error"); reject(err); await expect(promise).rejects.toBe(err); }); test("promise is instanceof Promise", () => { const { promise } = withResolvers(); expect(promise).toBeInstanceOf(Promise); }); test("works with generic type parameter", async () => { const { promise, resolve } = withResolvers<{ name: string }>(); resolve({ name: "test" }); const result = await promise; expect(result.name).toBe("test"); }); test("resolve/reject can be called asynchronously", async () => { const { promise, resolve } = withResolvers(); setTimeout(() => resolve(99), 10); const result = await promise; expect(result).toBe(99); }); });