refactor(telegram): extract native command menu helpers
This commit is contained in:
79
src/telegram/bot-native-command-menu.test.ts
Normal file
79
src/telegram/bot-native-command-menu.test.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
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"]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user