





















@@ -69,6 +69,46 @@ import { createTestRegistry } from "../../test-utils/channel-plugins.js";
6969let sendMessage: typeof import("./message.js").sendMessage;
7070let resetOutboundChannelResolutionStateForTest: typeof import("./channel-resolution.js").resetOutboundChannelResolutionStateForTest;
717172+function requireRecord(value: unknown, label: string): Record<string, unknown> {
73+if (typeof value !== "object" || value === null || Array.isArray(value)) {
74+throw new Error(`expected ${label} to be an object`);
75+}
76+return value as Record<string, unknown>;
77+}
78+79+function expectRecordFields(
80+value: unknown,
81+expected: Record<string, unknown>,
82+label: string,
83+): Record<string, unknown> {
84+const record = requireRecord(value, label);
85+for (const [key, expectedValue] of Object.entries(expected)) {
86+expect(record[key], `${label}.${key}`).toEqual(expectedValue);
87+}
88+return record;
89+}
90+91+function getMockCallArg(
92+mock: { mock: { calls: readonly unknown[][] } },
93+callIndex: number,
94+argIndex: number,
95+label: string,
96+): unknown {
97+const call = (mock.mock.calls as unknown[][])[callIndex];
98+if (!call) {
99+throw new Error(`expected ${label} call ${callIndex}`);
100+}
101+return call[argIndex];
102+}
103+104+function expectDeliveryCallFields(expected: Record<string, unknown>): Record<string, unknown> {
105+return expectRecordFields(
106+getMockCallArg(mocks.deliverOutboundPayloads, 0, 0, "outbound delivery"),
107+expected,
108+"outbound delivery params",
109+);
110+}
111+72112describe("sendMessage", () => {
73113beforeAll(async () => {
74114({ sendMessage } = await import("./message.js"));
@@ -101,13 +141,8 @@ describe("sendMessage", () => {
101141agentId: "work",
102142});
103143104-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
105-expect.objectContaining({
106-session: expect.objectContaining({ agentId: "work" }),
107-channel: "forum",
108-to: "123456",
109-}),
110-);
144+const deliveryParams = expectDeliveryCallFields({ channel: "forum", to: "123456" });
145+expectRecordFields(deliveryParams.session, { agentId: "work" }, "outbound session");
111146});
112147113148it("forwards requesterSenderId into the outbound delivery session", async () => {
@@ -122,13 +157,13 @@ describe("sendMessage", () => {
122157},
123158});
124159125-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
126-expect.objectContaining({
127- session: expect.objectContaining({
128- key: "agent:main:forum:group:ops",
129- requesterSenderId: "attacker",
130- }),
131-}),
160+expectRecordFields(
161+expectDeliveryCallFields({}).session,
162+{
163+key: "agent:main:forum:group:ops",
164+requesterSenderId: "attacker",
165+},
166+"outbound session",
132167);
133168});
134169@@ -146,15 +181,15 @@ describe("sendMessage", () => {
146181},
147182});
148183149-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
150-expect.objectContaining({
151- session: expect.objectContaining({
152- key: "agent:main:forum:group:ops",
153- requesterSenderName: "Alice",
154- requesterSenderUsername: "alice_u",
155- requesterSenderE164: "+15551234567",
156- }),
157-}),
184+expectRecordFields(
185+expectDeliveryCallFields({}).session,
186+{
187+key: "agent:main:forum:group:ops",
188+requesterSenderName: "Alice",
189+requesterSenderUsername: "alice_u",
190+requesterSenderE164: "+15551234567",
191+},
192+"outbound session",
158193);
159194});
160195@@ -172,17 +207,20 @@ describe("sendMessage", () => {
172207},
173208});
174209175-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
176-expect.objectContaining({
177-session: expect.objectContaining({
178-key: "agent:main:directchat:group:ops",
179-requesterAccountId: "work",
180-requesterSenderId: "attacker",
181-}),
182-mirror: expect.objectContaining({
183-sessionKey: "agent:main:forum:dm:123456",
184-}),
185-}),
210+const deliveryParams = expectDeliveryCallFields({});
211+expectRecordFields(
212+deliveryParams.session,
213+{
214+key: "agent:main:directchat:group:ops",
215+requesterAccountId: "work",
216+requesterSenderId: "attacker",
217+},
218+"outbound session",
219+);
220+expectRecordFields(
221+deliveryParams.mirror,
222+{ sessionKey: "agent:main:forum:dm:123456" },
223+"outbound mirror",
186224);
187225});
188226@@ -198,14 +236,14 @@ describe("sendMessage", () => {
198236},
199237});
200238201-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
202-expect.objectContaining({
203- mirror: expect.objectContaining({
204- sessionKey: "agent:main:forum:dm:123456",
205- text: "hi",
206- idempotencyKey: "idem-send-1",
207- }),
208-}),
239+expectRecordFields(
240+expectDeliveryCallFields({}).mirror,
241+{
242+sessionKey: "agent:main:forum:dm:123456",
243+text: "hi",
244+idempotencyKey: "idem-send-1",
245+},
246+"outbound mirror",
209247);
210248});
211249@@ -219,16 +257,14 @@ describe("sendMessage", () => {
219257asVoice: true,
220258});
221259222-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
223-expect.objectContaining({
224-payloads: [
225-expect.objectContaining({
226-text: "voice note",
227-mediaUrl: "file:///tmp/openclaw-voice.ogg",
228-audioAsVoice: true,
229-}),
230-],
231-}),
260+expectRecordFields(
261+(expectDeliveryCallFields({}).payloads as unknown[] | undefined)?.[0],
262+{
263+text: "voice note",
264+mediaUrl: "file:///tmp/openclaw-voice.ogg",
265+audioAsVoice: true,
266+},
267+"voice payload",
232268);
233269});
234270@@ -248,26 +284,35 @@ describe("sendMessage", () => {
248284 mediaAccess,
249285});
250286251-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
252-expect.objectContaining({
253- payloads: [
254- expect.objectContaining({
255- text: "prepared",
256- channelData: { forum: { card: true } },
257- }),
258-],
259-queuePolicy: "required",
260- mediaAccess,
261-}),
287+const deliveryParams = expectDeliveryCallFields({
288+queuePolicy: "required",
289+mediaAccess,
290+});
291+expectRecordFields(
292+(deliveryParams.payloads as unknown[] | undefined)?.[0],
293+{
294+text: "prepared",
295+channelData: { forum: { card: true } },
296+},
297+"prepared payload",
262298);
263-expect(mocks.resolveOutboundDurableFinalDeliverySupport).toHaveBeenCalledWith(
264-expect.objectContaining({
265-channel: "forum",
266-requirements: expect.objectContaining({
267-payload: true,
268-reconcileUnknownSend: true,
269-}),
270-}),
299+const supportParams = expectRecordFields(
300+getMockCallArg(
301+mocks.resolveOutboundDurableFinalDeliverySupport,
302+0,
303+0,
304+"durable delivery support",
305+),
306+{ channel: "forum" },
307+"durable delivery support params",
308+);
309+expectRecordFields(
310+supportParams.requirements,
311+{
312+payload: true,
313+reconcileUnknownSend: true,
314+},
315+"durable delivery requirements",
271316);
272317});
273318@@ -385,12 +430,14 @@ describe("sendMessage", () => {
385430mediaUrls: payload.mediaUrls ?? [],
386431}));
387432expect(payloadSummary, entry.name).toEqual(entry.expectedPayloads);
388-expect(deliveryCall?.mirror, entry.name).toEqual(
389-expect.objectContaining({
433+expectRecordFields(
434+deliveryCall?.mirror,
435+{
390436sessionKey: "agent:main:forum:dm:123456",
391437text: entry.expectedMirror.text,
392438mediaUrls: entry.expectedMirror.mediaUrls,
393-}),
439+},
440+entry.name,
394441);
395442}
396443});
@@ -404,18 +451,21 @@ describe("sendMessage", () => {
404451.mockReturnValueOnce(forumPlugin)
405452.mockReturnValue(forumPlugin);
406453407-await expect(
408-sendMessage({
409-cfg: { channels: { forum: { token: "test-token" } } },
410-channel: "forum",
411-to: "123456",
412-content: "hi",
413-}),
414-).resolves.toMatchObject({
454+const result = await sendMessage({
455+cfg: { channels: { forum: { token: "test-token" } } },
415456channel: "forum",
416457to: "123456",
417-via: "direct",
458+content: "hi",
418459});
460+expectRecordFields(
461+result,
462+{
463+channel: "forum",
464+to: "123456",
465+via: "direct",
466+},
467+"send message result",
468+);
419469420470expect(mocks.resolveRuntimePluginRegistry).not.toHaveBeenCalled();
421471});
@@ -442,26 +492,27 @@ describe("sendMessage", () => {
442492return [];
443493});
444494445-await expect(
446-sendMessage({
447-cfg: {},
448-channel: "forum",
449-to: "123456",
450-content: "hi",
451-bestEffort: true,
452-}),
453-).resolves.toMatchObject({
495+const result = await sendMessage({
496+cfg: {},
454497channel: "forum",
455498to: "123456",
456-via: "direct",
457-result: undefined,
499+content: "hi",
500+bestEffort: true,
458501});
459-460-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
461-expect.objectContaining({
462-bestEffort: true,
463-queuePolicy: "best_effort",
464-}),
502+expectRecordFields(
503+result,
504+{
505+channel: "forum",
506+to: "123456",
507+via: "direct",
508+result: undefined,
509+},
510+"best-effort send message result",
465511);
512+513+expectDeliveryCallFields({
514+bestEffort: true,
515+queuePolicy: "best_effort",
516+});
466517});
467518});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。