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 }); }); });