test: guard messaging extension mock calls

This commit is contained in:
Peter Steinberger
2026-05-12 10:16:35 +01:00
parent 43332ce3fa
commit 22667fb096
18 changed files with 21 additions and 18 deletions

View File

@@ -264,7 +264,7 @@ describe("media-chunked: ChunkedMediaApi.uploadChunked", () => {
// Progress callback hit 3 times with monotonically-increasing counts.
expect(onProgress).toHaveBeenCalledTimes(3);
const last = onProgress.mock.calls[2][0];
const last = onProgress.mock.calls.at(2)?.[0];
expect(last.completedParts).toBe(3);
expect(last.totalParts).toBe(3);
expect(last.uploadedBytes).toBe(FIXTURE_BUFFER.length);

View File

@@ -77,6 +77,6 @@ describe("trySlashCommand", () => {
expect(result).toBe("handled");
expect(writes).toHaveLength(1);
expect(qqbot?.streaming).toBe(true);
expect(vi.mocked(sendText).mock.calls[0]?.[1]).toContain("已开启");
expect(vi.mocked(sendText).mock.calls.at(0)?.[1]).toContain("已开启");
});
});

View File

@@ -202,7 +202,7 @@ describe("dispatchOutbound", () => {
accountId: "qq-main",
});
expect(audioFileToSilkBase64Mock).toHaveBeenCalledWith("/tmp/openclaw-qqbot/tts.wav");
const sentMedia = sendMediaMock.mock.calls[0]?.[0] as
const sentMedia = sendMediaMock.mock.calls.at(0)?.[0] as
| { kind?: string; source?: unknown; msgId?: string; ttsText?: string }
| undefined;
expect(sentMedia?.kind).toBe("voice");

View File

@@ -87,7 +87,7 @@ describe("Synology channel wiring integration", () => {
);
expect(registerPluginHttpRouteMock).toHaveBeenCalledTimes(1);
const firstCall = registerPluginHttpRouteMock.mock.calls[0];
const firstCall = registerPluginHttpRouteMock.mock.calls.at(0);
if (!firstCall) {
throw new Error("Expected registerPluginHttpRoute to be called");
}

View File

@@ -28,7 +28,7 @@ function countMatching<T>(items: readonly T[], predicate: (item: T) => boolean):
function deliveredMessage(deliver: ReturnType<typeof vi.fn>) {
expect(deliver).toHaveBeenCalledTimes(1);
const message = deliver.mock.calls[0]?.[0] as
const message = deliver.mock.calls.at(0)?.[0] as
| {
accountId?: unknown;
body?: unknown;

View File

@@ -99,7 +99,7 @@ describe("buildTelegramMessageContext DM topic threadId in deliveryContext (#889
expect(ctx?.ctxPayload.ReplyToBody).toBe("parent");
expect(buildChannelTurnContextMock).toHaveBeenCalledOnce();
const [turnOptions] = buildChannelTurnContextMock.mock.calls[0] ?? [];
const [turnOptions] = buildChannelTurnContextMock.mock.calls.at(0) ?? [];
expect(turnOptions?.channel).toBe("telegram");
expect(turnOptions?.from).toBe("telegram:1234");
expect(turnOptions?.message.rawBody).toBe("hello");

View File

@@ -146,7 +146,7 @@ describe("buildTelegramMessageContext reactions", () => {
expect(controller.setQueued).toHaveBeenCalledTimes(1);
expect(createStatusReactionController).toHaveBeenCalledTimes(1);
const params = createStatusReactionController.mock.calls[0]?.[0];
const params = createStatusReactionController.mock.calls.at(0)?.[0];
expect(params?.initialEmoji).toBe("👀");
expect(params?.emojis?.done).toBe("✅");

View File

@@ -68,7 +68,7 @@ async function buildForumTopicMessageContext(accountId?: string) {
function expectRouteArgs(): Record<string, unknown> {
expect(resolveTelegramConversationRouteMock).toHaveBeenCalledTimes(1);
return (
resolveTelegramConversationRouteMock.mock.calls[0] as unknown as [Record<string, unknown>]
resolveTelegramConversationRouteMock.mock.calls.at(0) as unknown as [Record<string, unknown>]
)[0];
}

View File

@@ -57,7 +57,7 @@ export async function waitForRegisteredCommands(
await vi.waitFor(() => {
expect(setMyCommands).toHaveBeenCalled();
});
return setMyCommands.mock.calls[0]?.[0] as RegisteredCommand[];
return setMyCommands.mock.calls.at(0)?.[0] as RegisteredCommand[];
}
export function resetNativeCommandMenuMocks() {

View File

@@ -222,7 +222,7 @@ describe("createTelegramBot command menu", () => {
await commandsSynced;
const registered = setMyCommandsSpy.mock.calls[0]?.[0] as Array<{
const registered = setMyCommandsSpy.mock.calls.at(0)?.[0] as Array<{
command: string;
description: string;
}>;

View File

@@ -297,7 +297,7 @@ describe("telegramMessageActions", () => {
toolContext: "toolContext" in testCase ? testCase.toolContext : undefined,
});
const call = handleTelegramActionMock.mock.calls[0]?.[0] as
const call = handleTelegramActionMock.mock.calls.at(0)?.[0] as
| Record<string, unknown>
| undefined;
if (!call) {

View File

@@ -209,7 +209,7 @@ describe("probeTelegram retry logic", () => {
allows_users_to_create_topics: false,
});
expect(fetchMock).toHaveBeenCalledTimes(1);
expect(fetchMock.mock.calls[0]?.[0]).toBe("https://api.telegram.org/bottest-token/getMe");
expect(fetchMock.mock.calls.at(0)?.[0]).toBe("https://api.telegram.org/bottest-token/getMe");
});
it("uses resolver-scoped Telegram fetch with probe network options", async () => {

View File

@@ -48,7 +48,7 @@ describe("tokenjuice bundled plugin", () => {
expect(createTokenjuiceOpenClawEmbeddedExtension).toHaveBeenCalledTimes(1);
expect(tokenjuiceFactory).toHaveBeenCalledTimes(1);
const registration = registerAgentToolResultMiddleware.mock.calls[0];
const registration = registerAgentToolResultMiddleware.mock.calls.at(0);
expect(typeof registration?.[0]).toBe("function");
expect(registration?.[1]).toEqual({ runtimes: ["pi", "codex"] });
});

View File

@@ -118,7 +118,10 @@ describe("vllm provider discovery contract", () => {
apiKey: "env-vllm-key",
});
expect(discoverOpenAICompatibleSelfHostedProviderMock).toHaveBeenCalledTimes(1);
const [discoveryParams] = discoverOpenAICompatibleSelfHostedProviderMock.mock.calls[0];
const [discoveryParams] = discoverOpenAICompatibleSelfHostedProviderMock.mock.calls.at(0) ?? [];
if (discoveryParams === undefined) {
throw new Error("expected discovery parameters");
}
expect(discoveryParams.providerId).toBe("vllm");
expect(discoveryParams.buildProvider).toBeTypeOf("function");
});

View File

@@ -54,7 +54,7 @@ describe("vydra speech provider", () => {
});
expect(fetchMock).toHaveBeenCalledTimes(2);
const [url, init] = fetchMock.mock.calls[0] as [string, RequestInit];
const [url, init] = fetchMock.mock.calls.at(0) as [string, RequestInit];
expect(url).toBe("https://www.vydra.ai/api/v1/models/elevenlabs/tts");
expect(init.method).toBe("POST");
expect(init.body).toBe(

View File

@@ -162,7 +162,7 @@ describe("buildXiaomiSpeechProvider", () => {
expect(result.audioBuffer.toString()).toBe("fake-mp3-audio");
expect(mockFetch).toHaveBeenCalledOnce();
const [url, init] = mockFetch.mock.calls[0];
const [url, init] = mockFetch.mock.calls.at(0) ?? [];
expect(url).toBe("https://api.xiaomimimo.com/v1/chat/completions");
expect(init?.headers).toEqual({
"api-key": "sk-test",

View File

@@ -84,7 +84,7 @@ describe("Zalo pairing lifecycle", () => {
meta: { name: "Unauthorized User" },
});
expect(sendMessageMock).toHaveBeenCalledTimes(1);
const [sendToken, sendPayload, sendOptions] = sendMessageMock.mock.calls[0] as [
const [sendToken, sendPayload, sendOptions] = sendMessageMock.mock.calls.at(0) as [
string,
{ chat_id?: string; text?: string },
unknown,

View File

@@ -112,7 +112,7 @@ describe("Zalo reply-once lifecycle", () => {
expect(recordArgs?.ctx?.To).toBe("zalo:dm-chat-1");
expect(recordArgs?.ctx?.MessageSid).toContain("zalo-replay-");
expect(sendMessageMock).toHaveBeenCalledTimes(1);
const [sendToken, sendPayload, sendOptions] = sendMessageMock.mock.calls[0] as [
const [sendToken, sendPayload, sendOptions] = sendMessageMock.mock.calls.at(0) as [
string,
{ chat_id?: string; text?: string },
unknown,