refactor(telegram): share native command test menu helpers

This commit is contained in:
Peter Steinberger
2026-03-17 04:32:38 +00:00
parent b0dd757ec8
commit 06ae5e9d21
3 changed files with 227 additions and 239 deletions

View File

@@ -1,102 +1,20 @@
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import type { OpenClawConfig } from "../../../src/config/config.js";
import type { TelegramAccountConfig } from "../../../src/config/types.js";
import { clearPluginCommands, registerPluginCommand } from "../../../src/plugins/commands.js";
import type { RuntimeEnv } from "../../../src/runtime.js";
import { registerTelegramNativeCommands } from "./bot-native-commands.js";
const { listSkillCommandsForAgents } = vi.hoisted(() => ({
listSkillCommandsForAgents: vi.fn(() => []),
}));
const deliveryMocks = vi.hoisted(() => ({
deliverReplies: vi.fn(async () => ({ delivered: true })),
}));
vi.mock("../../../src/auto-reply/skill-commands.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../../../src/auto-reply/skill-commands.js")>();
return {
...actual,
listSkillCommandsForAgents,
};
});
vi.mock("./bot/delivery.js", () => ({
deliverReplies: deliveryMocks.deliverReplies,
}));
import {
createCommandBot,
createNativeCommandTestParams,
createPrivateCommandContext,
deliverReplies,
resetNativeCommandMenuMocks,
waitForRegisteredCommands,
} from "./bot-native-commands.menu-test-support.js";
describe("registerTelegramNativeCommands real plugin registry", () => {
type RegisteredCommand = {
command: string;
description: string;
};
function createCommandBot() {
const commandHandlers = new Map<string, (ctx: unknown) => Promise<void>>();
const sendMessage = vi.fn().mockResolvedValue(undefined);
const setMyCommands = vi.fn().mockResolvedValue(undefined);
const bot = {
api: {
setMyCommands,
sendMessage,
},
command: vi.fn((name: string, cb: (ctx: unknown) => Promise<void>) => {
commandHandlers.set(name, cb);
}),
} as unknown as Parameters<typeof registerTelegramNativeCommands>[0]["bot"];
return { bot, commandHandlers, sendMessage, setMyCommands };
}
async function waitForRegisteredCommands(
setMyCommands: ReturnType<typeof vi.fn>,
): Promise<RegisteredCommand[]> {
await vi.waitFor(() => {
expect(setMyCommands).toHaveBeenCalled();
});
return setMyCommands.mock.calls[0]?.[0] as RegisteredCommand[];
}
const buildParams = (cfg: OpenClawConfig, accountId = "default") =>
({
bot: {
api: {
setMyCommands: vi.fn().mockResolvedValue(undefined),
sendMessage: vi.fn().mockResolvedValue(undefined),
},
command: vi.fn(),
} as unknown as Parameters<typeof registerTelegramNativeCommands>[0]["bot"],
cfg,
runtime: {} as RuntimeEnv,
accountId,
telegramCfg: {} as TelegramAccountConfig,
allowFrom: [],
groupAllowFrom: [],
replyToMode: "off",
textLimit: 4000,
useAccessGroups: false,
nativeEnabled: true,
nativeSkillsEnabled: true,
nativeDisabledExplicit: false,
resolveGroupPolicy: () =>
({
allowlistEnabled: false,
allowed: true,
}) as ReturnType<
Parameters<typeof registerTelegramNativeCommands>[0]["resolveGroupPolicy"]
>,
resolveTelegramGroupConfig: () => ({
groupConfig: undefined,
topicConfig: undefined,
}),
shouldSkipUpdate: () => false,
opts: { token: "token" },
}) satisfies Parameters<typeof registerTelegramNativeCommands>[0];
beforeEach(() => {
clearPluginCommands();
deliveryMocks.deliverReplies.mockClear();
deliveryMocks.deliverReplies.mockResolvedValue({ delivered: true });
listSkillCommandsForAgents.mockClear();
listSkillCommandsForAgents.mockReturnValue([]);
resetNativeCommandMenuMocks();
});
afterEach(() => {
@@ -117,7 +35,7 @@ describe("registerTelegramNativeCommands real plugin registry", () => {
).toEqual({ ok: true });
registerTelegramNativeCommands({
...buildParams({}),
...createNativeCommandTestParams({}),
bot,
});
@@ -129,17 +47,9 @@ describe("registerTelegramNativeCommands real plugin registry", () => {
const handler = commandHandlers.get("pair");
expect(handler).toBeTruthy();
await handler?.({
match: "now",
message: {
message_id: 1,
date: Math.floor(Date.now() / 1000),
chat: { id: 123, type: "private" },
from: { id: 456, username: "alice" },
},
});
await handler?.(createPrivateCommandContext({ match: "now" }));
expect(deliveryMocks.deliverReplies).toHaveBeenCalledWith(
expect(deliverReplies).toHaveBeenCalledWith(
expect.objectContaining({
replies: [expect.objectContaining({ text: "paired:now" })],
}),
@@ -165,7 +75,7 @@ describe("registerTelegramNativeCommands real plugin registry", () => {
).toEqual({ ok: true });
registerTelegramNativeCommands({
...buildParams({}),
...createNativeCommandTestParams({}),
bot,
});
@@ -177,17 +87,9 @@ describe("registerTelegramNativeCommands real plugin registry", () => {
const handler = commandHandlers.get("pair_device");
expect(handler).toBeTruthy();
await handler?.({
match: "now",
message: {
message_id: 2,
date: Math.floor(Date.now() / 1000),
chat: { id: 123, type: "private" },
from: { id: 456, username: "alice" },
},
});
await handler?.(createPrivateCommandContext({ match: "now", messageId: 2 }));
expect(deliveryMocks.deliverReplies).toHaveBeenCalledWith(
expect(deliverReplies).toHaveBeenCalledWith(
expect.objectContaining({
replies: [expect.objectContaining({ text: "paired:now" })],
}),
@@ -209,7 +111,7 @@ describe("registerTelegramNativeCommands real plugin registry", () => {
).toEqual({ ok: true });
registerTelegramNativeCommands({
...buildParams({}, "default"),
...createNativeCommandTestParams({}, { accountId: "default" }),
bot,
nativeEnabled: false,
});
@@ -232,7 +134,7 @@ describe("registerTelegramNativeCommands real plugin registry", () => {
).toEqual({ ok: true });
registerTelegramNativeCommands({
...buildParams({
...createNativeCommandTestParams({
commands: { allowFrom: { telegram: ["999"] } } as OpenClawConfig["commands"],
}),
bot,
@@ -245,17 +147,17 @@ describe("registerTelegramNativeCommands real plugin registry", () => {
const handler = commandHandlers.get("pair");
expect(handler).toBeTruthy();
await handler?.({
match: "now",
message: {
message_id: 10,
await handler?.(
createPrivateCommandContext({
match: "now",
messageId: 10,
date: 123456,
chat: { id: 123, type: "private" },
from: { id: 111, username: "nope" },
},
});
userId: 111,
username: "nope",
}),
);
expect(deliveryMocks.deliverReplies).toHaveBeenCalledWith(
expect(deliverReplies).toHaveBeenCalledWith(
expect.objectContaining({
replies: [expect.objectContaining({ text: "paired:now" })],
}),