diff --git a/src/cli/program/register.message.test.ts b/src/cli/program/register.message.test.ts new file mode 100644 index 000000000..e09f2789d --- /dev/null +++ b/src/cli/program/register.message.test.ts @@ -0,0 +1,123 @@ +import { Command } from "commander"; +import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import type { ProgramContext } from "./context.js"; + +const createMessageCliHelpersMock = vi.fn(() => ({ helper: true })); +const registerMessageSendCommandMock = vi.fn(); +const registerMessageBroadcastCommandMock = vi.fn(); +const registerMessagePollCommandMock = vi.fn(); +const registerMessageReactionsCommandsMock = vi.fn(); +const registerMessageReadEditDeleteCommandsMock = vi.fn(); +const registerMessagePinCommandsMock = vi.fn(); +const registerMessagePermissionsCommandMock = vi.fn(); +const registerMessageSearchCommandMock = vi.fn(); +const registerMessageThreadCommandsMock = vi.fn(); +const registerMessageEmojiCommandsMock = vi.fn(); +const registerMessageStickerCommandsMock = vi.fn(); +const registerMessageDiscordAdminCommandsMock = vi.fn(); + +vi.mock("./message/helpers.js", () => ({ + createMessageCliHelpers: createMessageCliHelpersMock, +})); + +vi.mock("./message/register.send.js", () => ({ + registerMessageSendCommand: registerMessageSendCommandMock, +})); + +vi.mock("./message/register.broadcast.js", () => ({ + registerMessageBroadcastCommand: registerMessageBroadcastCommandMock, +})); + +vi.mock("./message/register.poll.js", () => ({ + registerMessagePollCommand: registerMessagePollCommandMock, +})); + +vi.mock("./message/register.reactions.js", () => ({ + registerMessageReactionsCommands: registerMessageReactionsCommandsMock, +})); + +vi.mock("./message/register.read-edit-delete.js", () => ({ + registerMessageReadEditDeleteCommands: registerMessageReadEditDeleteCommandsMock, +})); + +vi.mock("./message/register.pins.js", () => ({ + registerMessagePinCommands: registerMessagePinCommandsMock, +})); + +vi.mock("./message/register.permissions-search.js", () => ({ + registerMessagePermissionsCommand: registerMessagePermissionsCommandMock, + registerMessageSearchCommand: registerMessageSearchCommandMock, +})); + +vi.mock("./message/register.thread.js", () => ({ + registerMessageThreadCommands: registerMessageThreadCommandsMock, +})); + +vi.mock("./message/register.emoji-sticker.js", () => ({ + registerMessageEmojiCommands: registerMessageEmojiCommandsMock, + registerMessageStickerCommands: registerMessageStickerCommandsMock, +})); + +vi.mock("./message/register.discord-admin.js", () => ({ + registerMessageDiscordAdminCommands: registerMessageDiscordAdminCommandsMock, +})); + +let registerMessageCommands: typeof import("./register.message.js").registerMessageCommands; + +beforeAll(async () => { + ({ registerMessageCommands } = await import("./register.message.js")); +}); + +describe("registerMessageCommands", () => { + const ctx: ProgramContext = { + programVersion: "9.9.9-test", + channelOptions: ["telegram", "discord"], + messageChannelOptions: "telegram|discord", + agentChannelOptions: "last|telegram|discord", + }; + + beforeEach(() => { + vi.clearAllMocks(); + createMessageCliHelpersMock.mockReturnValue({ helper: true }); + }); + + it("registers message command and wires all message sub-registrars with shared helpers", () => { + const program = new Command(); + registerMessageCommands(program, ctx); + + const message = program.commands.find((command) => command.name() === "message"); + expect(message).toBeDefined(); + expect(createMessageCliHelpersMock).toHaveBeenCalledWith(message, "telegram|discord"); + + const expectedRegistrars = [ + registerMessageSendCommandMock, + registerMessageBroadcastCommandMock, + registerMessagePollCommandMock, + registerMessageReactionsCommandsMock, + registerMessageReadEditDeleteCommandsMock, + registerMessagePinCommandsMock, + registerMessagePermissionsCommandMock, + registerMessageSearchCommandMock, + registerMessageThreadCommandsMock, + registerMessageEmojiCommandsMock, + registerMessageStickerCommandsMock, + registerMessageDiscordAdminCommandsMock, + ]; + for (const registrar of expectedRegistrars) { + expect(registrar).toHaveBeenCalledWith(message, { helper: true }); + } + }); + + it("shows command help when root message command is invoked", async () => { + const program = new Command().exitOverride(); + registerMessageCommands(program, ctx); + const message = program.commands.find((command) => command.name() === "message"); + expect(message).toBeDefined(); + const helpSpy = vi.spyOn(message as Command, "help").mockImplementation(() => { + throw new Error("help-called"); + }); + + await expect(program.parseAsync(["message"], { from: "user" })).rejects.toThrow("help-called"); + expect(helpSpy).toHaveBeenCalledWith({ error: true }); + }); +});