import { describe, expect, it, vi } from "vitest"; const resolveCliChannelOptionsMock = vi.fn(() => ["telegram", "whatsapp"]); vi.mock("../../version.js", () => ({ VERSION: "9.9.9-test", })); vi.mock("../channel-options.js", () => ({ resolveCliChannelOptions: resolveCliChannelOptionsMock, })); const { createProgramContext } = await import("./context.js"); describe("createProgramContext", () => { it("builds program context from version and resolved channel options", () => { resolveCliChannelOptionsMock.mockClear().mockReturnValue(["telegram", "whatsapp"]); const ctx = createProgramContext(); expect(ctx).toEqual({ programVersion: "9.9.9-test", channelOptions: ["telegram", "whatsapp"], messageChannelOptions: "telegram|whatsapp", agentChannelOptions: "last|telegram|whatsapp", }); expect(resolveCliChannelOptionsMock).toHaveBeenCalledOnce(); }); it("handles empty channel options", () => { resolveCliChannelOptionsMock.mockClear().mockReturnValue([]); const ctx = createProgramContext(); expect(ctx).toEqual({ programVersion: "9.9.9-test", channelOptions: [], messageChannelOptions: "", agentChannelOptions: "last", }); expect(resolveCliChannelOptionsMock).toHaveBeenCalledOnce(); }); it("does not resolve channel options before access", () => { resolveCliChannelOptionsMock.mockClear(); createProgramContext(); expect(resolveCliChannelOptionsMock).not.toHaveBeenCalled(); }); it("reuses one channel option resolution across all getters", () => { resolveCliChannelOptionsMock.mockClear().mockReturnValue(["telegram"]); const ctx = createProgramContext(); expect(ctx.channelOptions).toEqual(["telegram"]); expect(ctx.messageChannelOptions).toBe("telegram"); expect(ctx.agentChannelOptions).toBe("last|telegram"); expect(resolveCliChannelOptionsMock).toHaveBeenCalledOnce(); }); it("reads program version without resolving channel options", () => { resolveCliChannelOptionsMock.mockClear(); const ctx = createProgramContext(); expect(ctx.programVersion).toBe("9.9.9-test"); expect(resolveCliChannelOptionsMock).not.toHaveBeenCalled(); }); });