import { describe, expect, test } from "bun:test"; import { buildEventError, eventErrorSchema, isEventError, } from "./v3-error-events.js"; describe("v3 error events", () => { test("buildEventError creates a valid EventError message", () => { const msg = buildEventError({ gen: 1, code: "TEST_ERROR", }); expect(msg.t).toBe("getuserfeedback:event:error"); expect(msg.code).toBe("TEST_ERROR"); expect("recovery" in msg).toBe(false); expect(eventErrorSchema.safeParse(msg).success).toBe(true); }); test("buildEventError includes optional details when provided", () => { const msg = buildEventError({ gen: 1, code: "TEST_ERROR", details: { extra: "info" }, }); expect(msg.details).toEqual({ extra: "info" }); expect(eventErrorSchema.safeParse(msg).success).toBe(true); }); test("buildEventError includes optional recovery when provided", () => { const msg = buildEventError({ gen: 1, code: "TEST_ERROR", recovery: { resetViewState: true, retry: { operation: "prefetch", policy: { attempts: 2, backoffMs: 250 }, reason: "network", }, }, }); expect(msg.recovery).toEqual({ resetViewState: true, retry: { operation: "prefetch", policy: { attempts: 2, backoffMs: 250 }, reason: "network", }, }); expect(eventErrorSchema.safeParse(msg).success).toBe(true); }); test("buildEventError includes optional instanceId when provided", () => { const msg = buildEventError({ gen: 1, code: "TEST_ERROR", instanceId: "inst-123", }); expect(msg.instanceId).toBe("inst-123"); expect(eventErrorSchema.safeParse(msg).success).toBe(true); }); test("isEventError narrows valid error events", () => { const msg = buildEventError({ gen: 1, code: "TEST_ERROR" }); expect(isEventError(msg)).toBe(true); if (isEventError(msg)) { expect(msg.code).toBe("TEST_ERROR"); } }); test("isEventError rejects non-error messages", () => { expect( isEventError({ t: "getuserfeedback:event:ready", gen: 1, }), ).toBe(false); }); });