diff --git a/src/cli/program/build-program.test.ts b/src/cli/program/build-program.test.ts new file mode 100644 index 000000000..1589f9c93 --- /dev/null +++ b/src/cli/program/build-program.test.ts @@ -0,0 +1,62 @@ +import process from "node:process"; +import { Command } from "commander"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import type { ProgramContext } from "./context.js"; + +const registerProgramCommandsMock = vi.fn(); +const createProgramContextMock = vi.fn(); +const configureProgramHelpMock = vi.fn(); +const registerPreActionHooksMock = vi.fn(); +const setProgramContextMock = vi.fn(); + +vi.mock("./command-registry.js", () => ({ + registerProgramCommands: registerProgramCommandsMock, +})); + +vi.mock("./context.js", () => ({ + createProgramContext: createProgramContextMock, +})); + +vi.mock("./help.js", () => ({ + configureProgramHelp: configureProgramHelpMock, +})); + +vi.mock("./preaction.js", () => ({ + registerPreActionHooks: registerPreActionHooksMock, +})); + +vi.mock("./program-context.js", () => ({ + setProgramContext: setProgramContextMock, +})); + +const { buildProgram } = await import("./build-program.js"); + +describe("buildProgram", () => { + beforeEach(() => { + vi.clearAllMocks(); + createProgramContextMock.mockReturnValue({ + programVersion: "9.9.9-test", + channelOptions: ["telegram"], + messageChannelOptions: "telegram", + agentChannelOptions: "last|telegram", + } satisfies ProgramContext); + }); + + it("wires context/help/preaction/command registration with shared context", () => { + const argv = ["node", "openclaw", "status"]; + const originalArgv = process.argv; + process.argv = argv; + try { + const program = buildProgram(); + const ctx = createProgramContextMock.mock.results[0]?.value as ProgramContext; + + expect(program).toBeInstanceOf(Command); + expect(setProgramContextMock).toHaveBeenCalledWith(program, ctx); + expect(configureProgramHelpMock).toHaveBeenCalledWith(program, ctx); + expect(registerPreActionHooksMock).toHaveBeenCalledWith(program, ctx.programVersion); + expect(registerProgramCommandsMock).toHaveBeenCalledWith(program, ctx, argv); + } finally { + process.argv = originalArgv; + } + }); +});