import { describe, expect, test } from "bun:test"; import { classifyError, isErrorCode, isWidgetError, readErrorCode, wrapError, } from "./widget-error.js"; describe("widget error helpers", () => { test("classifies known error codes", () => { expect(classifyError({ code: "invalidOrigin" })).toEqual({ code: "invalidOrigin", detail: { code: "invalidOrigin" }, }); expect(classifyError({ code: "timeout" })).toEqual({ code: "timeout", detail: { code: "timeout" }, }); expect(classifyError({ code: "iframeError" })).toEqual({ code: "iframeError", detail: { code: "iframeError" }, }); }); test("wraps errors with context and derived retryability", () => { const wrapped = wrapError( new Error("timed out"), { domain: "handshake", op: "waitForHello" }, { code: "timeout" }, ); expect(isWidgetError(wrapped)).toBe(true); expect(wrapped.code).toBe("timeout"); expect(wrapped.retryable).toBe(true); expect(wrapped.context).toEqual({ domain: "handshake", op: "waitForHello", }); }); test("reads nested and top-level error codes", () => { expect(isErrorCode("internal")).toBe(true); expect(isErrorCode("unknown")).toBe(false); expect(readErrorCode({ code: "internal" })).toBe("internal"); expect(readErrorCode({ cause: { code: "timeout" } })).toBe("timeout"); }); });