import { describe, expect, it, vi } from "vitest"; import { buildCappedTelegramMenuCommands, buildPluginTelegramMenuCommands, syncTelegramMenuCommands, } from "./bot-native-command-menu.js"; describe("bot-native-command-menu", () => { it("caps menu entries to Telegram limit", () => { const allCommands = Array.from({ length: 105 }, (_, i) => ({ command: `cmd_${i}`, description: `Command ${i}`, })); const result = buildCappedTelegramMenuCommands({ allCommands }); expect(result.commandsToRegister).toHaveLength(100); expect(result.totalCommands).toBe(105); expect(result.maxCommands).toBe(100); expect(result.overflowCount).toBe(5); expect(result.commandsToRegister[0]).toEqual({ command: "cmd_0", description: "Command 0" }); expect(result.commandsToRegister[99]).toEqual({ command: "cmd_99", description: "Command 99", }); }); it("validates plugin command specs and reports conflicts", () => { const existingCommands = new Set(["native"]); const result = buildPluginTelegramMenuCommands({ specs: [ { name: "valid", description: " Works " }, { name: "bad-name!", description: "Bad" }, { name: "native", description: "Conflicts with native" }, { name: "valid", description: "Duplicate plugin name" }, { name: "empty", description: " " }, ], existingCommands, }); expect(result.commands).toEqual([{ command: "valid", description: "Works" }]); expect(result.issues).toContain( 'Plugin command "/bad-name!" is invalid for Telegram (use a-z, 0-9, underscore; max 32 chars).', ); expect(result.issues).toContain( 'Plugin command "/native" conflicts with an existing Telegram command.', ); expect(result.issues).toContain('Plugin command "/valid" is duplicated.'); expect(result.issues).toContain('Plugin command "/empty" is missing a description.'); }); it("deletes stale commands before setting new menu", async () => { const callOrder: string[] = []; const deleteMyCommands = vi.fn(async () => { callOrder.push("delete"); }); const setMyCommands = vi.fn(async () => { callOrder.push("set"); }); syncTelegramMenuCommands({ bot: { api: { deleteMyCommands, setMyCommands, }, } as unknown as Parameters[0]["bot"], runtime: {} as Parameters[0]["runtime"], commandsToRegister: [{ command: "cmd", description: "Command" }], }); await vi.waitFor(() => { expect(setMyCommands).toHaveBeenCalled(); }); expect(callOrder).toEqual(["delete", "set"]); }); });