import { describe, expect, test } from "bun:test"; import { buildEventColorSchemeUpdate, buildEventHostColorScheme, eventColorSchemeUpdateSchema, eventHostColorSchemeSchema, isEventColorSchemeUpdate, isEventHostColorScheme, } from "./v3-color-scheme-events.js"; import { createGeneration } from "./v3-generation.js"; const hostColorSchemeMessage = { t: "getuserfeedback:event:hostColorScheme", gen: createGeneration(2), instanceId: "instance-a", hostColorScheme: "dark", } as const; const colorSchemeUpdateMessage = { t: "getuserfeedback:event:colorSchemeUpdate", gen: createGeneration(2), viewId: "view-a", colorScheme: "system", } as const; describe("v3 color scheme events", () => { test("accepts host color scheme messages", () => { expect( eventHostColorSchemeSchema.safeParse(hostColorSchemeMessage).success, ).toBe(true); expect( eventHostColorSchemeSchema.safeParse({ ...hostColorSchemeMessage, hostColorScheme: null, }).success, ).toBe(true); }); test("accepts color scheme update messages", () => { expect( eventColorSchemeUpdateSchema.safeParse(colorSchemeUpdateMessage).success, ).toBe(true); }); test("builds canonical color scheme envelopes", () => { expect( buildEventHostColorScheme({ gen: 2, instanceId: "instance-a", hostColorScheme: "dark", }), ).toEqual(hostColorSchemeMessage); expect( buildEventColorSchemeUpdate({ gen: 2, viewId: "view-a", colorScheme: "system", }), ).toEqual(colorSchemeUpdateMessage); }); test("narrows color scheme messages with type guards", () => { expect(isEventHostColorScheme(hostColorSchemeMessage)).toBe(true); expect(isEventColorSchemeUpdate(colorSchemeUpdateMessage)).toBe(true); expect(isEventHostColorScheme(colorSchemeUpdateMessage)).toBe(false); }); test("rejects invalid color scheme payloads", () => { for (const message of [ { ...hostColorSchemeMessage, instanceId: " " }, { ...hostColorSchemeMessage, hostColorScheme: "sepia" }, { ...colorSchemeUpdateMessage, viewId: " " }, { ...colorSchemeUpdateMessage, colorScheme: "auto" }, ]) { expect( eventHostColorSchemeSchema.safeParse(message).success || eventColorSchemeUpdateSchema.safeParse(message).success, ).toBe(false); } }); });