From e184cd97cce9c290373dba470a2f15b8aad826ba Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Tue, 17 Mar 2026 06:31:29 +0000 Subject: [PATCH] refactor(telegram-tests): share native command helpers --- ...ve-commands.plugin-command-test-support.ts | 22 +++++ .../src/bot-native-commands.registry.test.ts | 93 ++++++++----------- ...t-native-commands.skills-allowlist.test.ts | 20 +--- .../telegram/src/bot-native-commands.test.ts | 22 +---- 4 files changed, 73 insertions(+), 84 deletions(-) create mode 100644 extensions/telegram/src/bot-native-commands.plugin-command-test-support.ts diff --git a/extensions/telegram/src/bot-native-commands.plugin-command-test-support.ts b/extensions/telegram/src/bot-native-commands.plugin-command-test-support.ts new file mode 100644 index 00000000000..b4a47b728e4 --- /dev/null +++ b/extensions/telegram/src/bot-native-commands.plugin-command-test-support.ts @@ -0,0 +1,22 @@ +import { vi } from "vitest"; + +export const pluginCommandMocks = { + getPluginCommandSpecs: vi.fn(() => []), + matchPluginCommand: vi.fn(() => null), + executePluginCommand: vi.fn(async () => ({ text: "ok" })), +}; + +vi.mock("../../../src/plugins/commands.js", () => ({ + getPluginCommandSpecs: pluginCommandMocks.getPluginCommandSpecs, + matchPluginCommand: pluginCommandMocks.matchPluginCommand, + executePluginCommand: pluginCommandMocks.executePluginCommand, +})); + +export function resetPluginCommandMocks() { + pluginCommandMocks.getPluginCommandSpecs.mockClear(); + pluginCommandMocks.getPluginCommandSpecs.mockReturnValue([]); + pluginCommandMocks.matchPluginCommand.mockClear(); + pluginCommandMocks.matchPluginCommand.mockReturnValue(null); + pluginCommandMocks.executePluginCommand.mockClear(); + pluginCommandMocks.executePluginCommand.mockResolvedValue({ text: "ok" }); +} diff --git a/extensions/telegram/src/bot-native-commands.registry.test.ts b/extensions/telegram/src/bot-native-commands.registry.test.ts index 55379e6a5fa..d671be06609 100644 --- a/extensions/telegram/src/bot-native-commands.registry.test.ts +++ b/extensions/telegram/src/bot-native-commands.registry.test.ts @@ -17,6 +17,38 @@ import { waitForRegisteredCommands, } from "./bot-native-commands.menu-test-support.js"; +function registerPairPluginCommand(params?: { + nativeNames?: { telegram?: string; discord?: string }; +}) { + expect( + registerPluginCommand("demo-plugin", { + name: "pair", + ...(params?.nativeNames ? { nativeNames: params.nativeNames } : {}), + description: "Pair device", + acceptsArgs: true, + requireAuth: false, + handler: async ({ args }) => ({ text: `paired:${args ?? ""}` }), + }), + ).toEqual({ ok: true }); +} + +async function registerPairMenu(params: { + bot: ReturnType["bot"]; + setMyCommands: ReturnType["setMyCommands"]; + nativeNames?: { telegram?: string; discord?: string }; +}) { + registerPairPluginCommand({ + ...(params.nativeNames ? { nativeNames: params.nativeNames } : {}), + }); + + registerTelegramNativeCommands({ + ...createNativeCommandTestParams({}), + bot: params.bot, + }); + + return await waitForRegisteredCommands(params.setMyCommands); +} + describe("registerTelegramNativeCommands real plugin registry", () => { beforeEach(() => { clearPluginCommands(); @@ -31,22 +63,7 @@ describe("registerTelegramNativeCommands real plugin registry", () => { it("registers and executes plugin commands through the real plugin registry", async () => { const { bot, commandHandlers, sendMessage, setMyCommands } = createCommandBot(); - expect( - registerPluginCommand("demo-plugin", { - name: "pair", - description: "Pair device", - acceptsArgs: true, - requireAuth: false, - handler: async ({ args }) => ({ text: `paired:${args ?? ""}` }), - }), - ).toEqual({ ok: true }); - - registerTelegramNativeCommands({ - ...createNativeCommandTestParams({}), - bot, - }); - - const registeredCommands = await waitForRegisteredCommands(setMyCommands); + const registeredCommands = await registerPairMenu({ bot, setMyCommands }); expect(registeredCommands).toEqual( expect.arrayContaining([{ command: "pair", description: "Pair device" }]), ); @@ -67,26 +84,14 @@ describe("registerTelegramNativeCommands real plugin registry", () => { it("round-trips Telegram native aliases through the real plugin registry", async () => { const { bot, commandHandlers, sendMessage, setMyCommands } = createCommandBot(); - expect( - registerPluginCommand("demo-plugin", { - name: "pair", - nativeNames: { - telegram: "pair_device", - discord: "pairdiscord", - }, - description: "Pair device", - acceptsArgs: true, - requireAuth: false, - handler: async ({ args }) => ({ text: `paired:${args ?? ""}` }), - }), - ).toEqual({ ok: true }); - - registerTelegramNativeCommands({ - ...createNativeCommandTestParams({}), + const registeredCommands = await registerPairMenu({ bot, + setMyCommands, + nativeNames: { + telegram: "pair_device", + discord: "pairdiscord", + }, }); - - const registeredCommands = await waitForRegisteredCommands(setMyCommands); expect(registeredCommands).toEqual( expect.arrayContaining([{ command: "pair_device", description: "Pair device" }]), ); @@ -107,15 +112,7 @@ describe("registerTelegramNativeCommands real plugin registry", () => { it("keeps real plugin command handlers available when native menu registration is disabled", () => { const { bot, commandHandlers, setMyCommands } = createCommandBot(); - expect( - registerPluginCommand("demo-plugin", { - name: "pair", - description: "Pair device", - acceptsArgs: true, - requireAuth: false, - handler: async ({ args }) => ({ text: `paired:${args ?? ""}` }), - }), - ).toEqual({ ok: true }); + registerPairPluginCommand(); registerTelegramNativeCommands({ ...createNativeCommandTestParams({}, { accountId: "default" }), @@ -130,15 +127,7 @@ describe("registerTelegramNativeCommands real plugin registry", () => { it("allows requireAuth:false plugin commands for unauthorized senders through the real registry", async () => { const { bot, commandHandlers, sendMessage, setMyCommands } = createCommandBot(); - expect( - registerPluginCommand("demo-plugin", { - name: "pair", - description: "Pair device", - acceptsArgs: true, - requireAuth: false, - handler: async ({ args }) => ({ text: `paired:${args ?? ""}` }), - }), - ).toEqual({ ok: true }); + registerPairPluginCommand(); registerTelegramNativeCommands({ ...createNativeCommandTestParams({ diff --git a/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts b/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts index d15db967767..29540bb9011 100644 --- a/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts +++ b/extensions/telegram/src/bot-native-commands.skills-allowlist.test.ts @@ -10,18 +10,10 @@ import { resetNativeCommandMenuMocks, waitForRegisteredCommands, } from "./bot-native-commands.menu-test-support.js"; - -const pluginCommandMocks = vi.hoisted(() => ({ - getPluginCommandSpecs: vi.fn(() => []), - matchPluginCommand: vi.fn(() => null), - executePluginCommand: vi.fn(async () => ({ text: "ok" })), -})); - -vi.mock("../../../src/plugins/commands.js", () => ({ - getPluginCommandSpecs: pluginCommandMocks.getPluginCommandSpecs, - matchPluginCommand: pluginCommandMocks.matchPluginCommand, - executePluginCommand: pluginCommandMocks.executePluginCommand, -})); +import { + pluginCommandMocks, + resetPluginCommandMocks, +} from "./bot-native-commands.plugin-command-test-support.js"; const tempDirs: string[] = []; @@ -34,9 +26,7 @@ async function makeWorkspace(prefix: string) { describe("registerTelegramNativeCommands skill allowlist integration", () => { afterEach(async () => { resetNativeCommandMenuMocks(); - pluginCommandMocks.getPluginCommandSpecs.mockClear().mockReturnValue([]); - pluginCommandMocks.matchPluginCommand.mockClear().mockReturnValue(null); - pluginCommandMocks.executePluginCommand.mockClear().mockResolvedValue({ text: "ok" }); + resetPluginCommandMocks(); await Promise.all( tempDirs .splice(0, tempDirs.length) diff --git a/extensions/telegram/src/bot-native-commands.test.ts b/extensions/telegram/src/bot-native-commands.test.ts index 683842fa2df..a3f5ab3a9ce 100644 --- a/extensions/telegram/src/bot-native-commands.test.ts +++ b/extensions/telegram/src/bot-native-commands.test.ts @@ -5,6 +5,10 @@ import { STATE_DIR } from "../../../src/config/paths.js"; import { TELEGRAM_COMMAND_NAME_PATTERN } from "../../../src/config/telegram-custom-commands.js"; import type { TelegramAccountConfig } from "../../../src/config/types.js"; import type { RuntimeEnv } from "../../../src/runtime.js"; +import { + pluginCommandMocks, + resetPluginCommandMocks, +} from "./bot-native-commands.plugin-command-test-support.js"; const skillCommandMocks = vi.hoisted(() => ({ listSkillCommandsForAgents: vi.fn(() => []), })); @@ -32,29 +36,13 @@ import { waitForRegisteredCommands, } from "./bot-native-commands.menu-test-support.js"; -const pluginCommandMocks = vi.hoisted(() => ({ - getPluginCommandSpecs: vi.fn(() => []), - matchPluginCommand: vi.fn(() => null), - executePluginCommand: vi.fn(async () => ({ text: "ok" })), -})); -vi.mock("../../../src/plugins/commands.js", () => ({ - getPluginCommandSpecs: pluginCommandMocks.getPluginCommandSpecs, - matchPluginCommand: pluginCommandMocks.matchPluginCommand, - executePluginCommand: pluginCommandMocks.executePluginCommand, -})); - describe("registerTelegramNativeCommands", () => { beforeEach(() => { skillCommandMocks.listSkillCommandsForAgents.mockClear(); skillCommandMocks.listSkillCommandsForAgents.mockReturnValue([]); deliveryMocks.deliverReplies.mockClear(); deliveryMocks.deliverReplies.mockResolvedValue({ delivered: true }); - pluginCommandMocks.getPluginCommandSpecs.mockClear(); - pluginCommandMocks.getPluginCommandSpecs.mockReturnValue([]); - pluginCommandMocks.matchPluginCommand.mockClear(); - pluginCommandMocks.matchPluginCommand.mockReturnValue(null); - pluginCommandMocks.executePluginCommand.mockClear(); - pluginCommandMocks.executePluginCommand.mockResolvedValue({ text: "ok" }); + resetPluginCommandMocks(); }); it("scopes skill commands when account binding exists", () => {