| 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<typeof syncTelegramMenuCommands>[0]["bot"], |
| runtime: {} as Parameters<typeof syncTelegramMenuCommands>[0]["runtime"], |
| commandsToRegister: [{ command: "cmd", description: "Command" }], |
| }); |
|
|
| await vi.waitFor(() => { |
| expect(setMyCommands).toHaveBeenCalled(); |
| }); |
|
|
| expect(callOrder).toEqual(["delete", "set"]); |
| }); |
| }); |
|
|