Files
openclaw/extensions/discord/src/send.webhook-activity.test.ts
2026-05-09 05:21:42 +01:00

110 lines
3.1 KiB
TypeScript

import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
const recordChannelActivityMock = vi.hoisted(() => vi.fn());
const loadConfigMock = vi.hoisted(() => vi.fn(() => ({ channels: { discord: {} } })));
vi.mock("openclaw/plugin-sdk/plugin-config-runtime", async () => {
const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/plugin-config-runtime")>(
"openclaw/plugin-sdk/plugin-config-runtime",
);
return {
...actual,
requireRuntimeConfig: (cfg: unknown) => cfg ?? loadConfigMock(),
};
});
vi.mock("openclaw/plugin-sdk/channel-activity-runtime", async () => {
const actual = await vi.importActual<
typeof import("openclaw/plugin-sdk/channel-activity-runtime")
>("openclaw/plugin-sdk/channel-activity-runtime");
return {
...actual,
recordChannelActivity: (...args: unknown[]) => recordChannelActivityMock(...args),
};
});
let sendWebhookMessageDiscord: typeof import("./send.webhook.js").sendWebhookMessageDiscord;
describe("sendWebhookMessageDiscord activity", () => {
beforeAll(async () => {
({ sendWebhookMessageDiscord } = await import("./send.webhook.js"));
});
beforeEach(() => {
recordChannelActivityMock.mockClear();
loadConfigMock.mockClear();
vi.stubGlobal(
"fetch",
vi.fn(async () => {
return new Response(JSON.stringify({ id: "msg-1", channel_id: "thread-1" }), {
status: 200,
headers: { "content-type": "application/json" },
});
}),
);
});
afterEach(() => {
vi.unstubAllGlobals();
});
it("records outbound channel activity for webhook sends", async () => {
const cfg = {
channels: {
discord: {
token: "resolved-token",
},
},
};
const result = await sendWebhookMessageDiscord("hello world", {
cfg,
webhookId: "wh-1",
webhookToken: "tok-1",
accountId: "runtime",
threadId: "thread-1",
});
expect(result).toMatchObject({
messageId: "msg-1",
channelId: "thread-1",
receipt: expect.objectContaining({
threadId: "thread-1",
platformMessageIds: ["msg-1"],
}),
});
expect(recordChannelActivityMock).toHaveBeenCalledWith({
channel: "discord",
accountId: "runtime",
direction: "outbound",
});
expect(loadConfigMock).not.toHaveBeenCalled();
});
it("rewrites configured mention aliases for webhook sends", async () => {
const cfg = {
channels: {
discord: {
token: "resolved-token",
mentionAliases: {
opslead: "123456789012345678",
},
},
},
};
await sendWebhookMessageDiscord("hello @OpsLead", {
cfg,
webhookId: "wh-1",
webhookToken: "tok-1",
accountId: "runtime",
threadId: "thread-1",
});
expect(fetch).toHaveBeenCalledWith(
"https://discord.com/api/v10/webhooks/wh-1/tok-1?wait=true&thread_id=thread-1",
expect.objectContaining({
body: expect.stringContaining('"content":"hello <@123456789012345678>"'),
}),
);
});
});