




















@@ -3,30 +3,22 @@ import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env";
33import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
44import type { RequestClient } from "../internal/discord.js";
556-const deliverOutboundPayloadsMock = vi.hoisted(() =>
7-vi.fn(async () => [{ messageId: "msg-1", channelId: "channel-1" }]),
6+const sendDurableMessageBatchMock = vi.hoisted(() =>
7+vi.fn(async () => ({
8+status: "sent" as const,
9+results: [{ messageId: "msg-1", channelId: "channel-1" }],
10+})),
811);
912const sendMessageDiscordMock = vi.hoisted(() => vi.fn());
1013const sendVoiceMessageDiscordMock = vi.hoisted(() => vi.fn());
111412-vi.mock("openclaw/plugin-sdk/outbound-runtime", async () => {
13-const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/outbound-runtime")>(
14-"openclaw/plugin-sdk/outbound-runtime",
15+vi.mock("openclaw/plugin-sdk/channel-message", async () => {
16+const actual = await vi.importActual<typeof import("openclaw/plugin-sdk/channel-message")>(
17+"openclaw/plugin-sdk/channel-message",
1518);
1619return {
1720 ...actual,
18-deliverOutboundPayloads: deliverOutboundPayloadsMock,
19-};
20-});
21-22-vi.mock("../../../../src/infra/outbound/deliver.js", async () => {
23-const actual = await vi.importActual<typeof import("../../../../src/infra/outbound/deliver.js")>(
24-"../../../../src/infra/outbound/deliver.js",
25-);
26-return {
27- ...actual,
28-deliverOutboundPayloads: deliverOutboundPayloadsMock,
29-deliverOutboundPayloadsInternal: deliverOutboundPayloadsMock,
21+sendDurableMessageBatch: sendDurableMessageBatchMock,
3022};
3123});
3224@@ -42,7 +34,7 @@ vi.mock("../send.js", async () => {
4234let deliverDiscordReply: typeof import("./reply-delivery.js").deliverDiscordReply;
43354436function firstDeliverParams() {
45-const calls = deliverOutboundPayloadsMock.mock.calls as unknown as Array<
37+const calls = sendDurableMessageBatchMock.mock.calls as unknown as Array<
4638[
4739{
4840cfg?: OpenClawConfig;
@@ -53,7 +45,7 @@ function firstDeliverParams() {
5345>;
5446const params = calls[0]?.[0];
5547if (!params) {
56-throw new Error("deliverOutboundPayloads was not called");
48+throw new Error("sendDurableMessageBatch was not called");
5749}
5850return params;
5951}
@@ -69,8 +61,11 @@ describe("deliverDiscordReply", () => {
6961});
70627163beforeEach(() => {
72-deliverOutboundPayloadsMock.mockClear();
73-deliverOutboundPayloadsMock.mockResolvedValue([{ messageId: "msg-1", channelId: "channel-1" }]);
64+sendDurableMessageBatchMock.mockClear();
65+sendDurableMessageBatchMock.mockResolvedValue({
66+status: "sent",
67+results: [{ messageId: "msg-1", channelId: "channel-1" }],
68+});
7469sendMessageDiscordMock.mockReset().mockResolvedValue({
7570messageId: "msg-1",
7671channelId: "channel-1",
@@ -98,7 +93,7 @@ describe("deliverDiscordReply", () => {
9893replyToMode: "all",
9994});
10095101-expect(deliverOutboundPayloadsMock).toHaveBeenCalledWith(
96+expect(sendDurableMessageBatchMock).toHaveBeenCalledWith(
10297expect.objectContaining({
10398channel: "discord",
10499to: "channel:101",
@@ -119,7 +114,7 @@ describe("deliverDiscordReply", () => {
119114});
120115121116it("fails when shared outbound accepts a final reply but delivers no Discord message", async () => {
122-deliverOutboundPayloadsMock.mockResolvedValueOnce([]);
117+sendDurableMessageBatchMock.mockResolvedValueOnce({ status: "sent", results: [] });
123118124119await expect(
125120deliverDiscordReply({
@@ -154,7 +149,7 @@ describe("deliverDiscordReply", () => {
154149textLimit: 2000,
155150});
156151157-expect(deliverOutboundPayloadsMock).toHaveBeenCalledWith(
152+expect(sendDurableMessageBatchMock).toHaveBeenCalledWith(
158153expect.objectContaining({
159154payloads: [{ text: "Visible reply." }],
160155}),
@@ -177,7 +172,7 @@ describe("deliverDiscordReply", () => {
177172textLimit: 2000,
178173});
179174180-expect(deliverOutboundPayloadsMock).toHaveBeenCalledWith(
175+expect(sendDurableMessageBatchMock).toHaveBeenCalledWith(
181176expect.objectContaining({
182177payloads: [{ mediaUrl: "https://example.com/result.png", text: undefined }],
183178}),
@@ -218,7 +213,7 @@ describe("deliverDiscordReply", () => {
218213textLimit: 2000,
219214});
220215221-expect(deliverOutboundPayloadsMock).toHaveBeenCalledWith(
216+expect(sendDurableMessageBatchMock).toHaveBeenCalledWith(
222217expect.objectContaining({
223218payloads: [{ channelData, text: undefined }],
224219}),
@@ -251,7 +246,7 @@ describe("deliverDiscordReply", () => {
251246textLimit: 2000,
252247});
253248254-expect(deliverOutboundPayloadsMock).toHaveBeenCalledWith(
249+expect(sendDurableMessageBatchMock).toHaveBeenCalledWith(
255250expect.objectContaining({
256251payloads: [{ presentation, text: undefined }],
257252}),
@@ -271,7 +266,7 @@ describe("deliverDiscordReply", () => {
271266textLimit: 2000,
272267});
273268274-expect(deliverOutboundPayloadsMock).toHaveBeenCalledWith(
269+expect(sendDurableMessageBatchMock).toHaveBeenCalledWith(
275270expect.objectContaining({
276271payloads: [{ text }],
277272}),
@@ -296,7 +291,7 @@ describe("deliverDiscordReply", () => {
296291textLimit: 2000,
297292});
298293299-expect(deliverOutboundPayloadsMock).toHaveBeenCalledWith(
294+expect(sendDurableMessageBatchMock).toHaveBeenCalledWith(
300295expect.objectContaining({
301296payloads: [{ text }],
302297}),
@@ -362,7 +357,7 @@ describe("deliverDiscordReply", () => {
362357mediaLocalRoots: ["/tmp/openclaw-media"],
363358});
364359365-expect(deliverOutboundPayloadsMock).toHaveBeenCalledWith(
360+expect(sendDurableMessageBatchMock).toHaveBeenCalledWith(
366361expect.objectContaining({
367362payloads: replies,
368363replyToId: undefined,
@@ -426,7 +421,7 @@ describe("deliverDiscordReply", () => {
426421 threadBindings,
427422});
428423429-expect(deliverOutboundPayloadsMock).toHaveBeenCalledWith(
424+expect(sendDurableMessageBatchMock).toHaveBeenCalledWith(
430425expect.objectContaining({
431426to: "channel:parent-1",
432427threadId: "thread-1",
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。