

























@@ -9,7 +9,7 @@ import { sleep } from "openclaw/plugin-sdk/text-utility-runtime";
99import { beforeAll, describe, expect, it, vi } from "vitest";
1010import { createAcceptedWhatsAppSendResult } from "../inbound/send-result.test-helper.js";
1111import { createTestWebInboundMessage } from "../inbound/test-message.test-helper.js";
12-import type { WebInboundMessage } from "../inbound/types.js";
12+import type { AdmittedWebInboundMessage } from "../inbound/types.js";
1313import { loadWebMedia } from "../media.js";
1414import { cacheInboundMessageMeta } from "../quoted-message.js";
1515import { WhatsAppSocketOperationTimeoutError } from "../socket-timing.js";
@@ -69,7 +69,7 @@ function unacceptedSendResult(kind: "media" | "text") {
6969};
7070}
717172-function makeMsg(): WebInboundMessage {
72+function makeMsg(): AdmittedWebInboundMessage {
7373return createTestWebInboundMessage({
7474event: { id: "msg-1" },
7575payload: { body: "latest batch body" },
@@ -80,10 +80,19 @@ function makeMsg(): WebInboundMessage {
8080reply: vi.fn(async () => createAcceptedWhatsAppSendResult("text", "reply-sent-1")),
8181sendMedia: vi.fn(async () => createAcceptedWhatsAppSendResult("media", "media-sent-1")),
8282},
83-from: "+10000000000",
84-accountId: "work",
85-chatType: "group",
86-conversationId: "+10000000000",
83+admission: {
84+accountId: "work",
85+conversation: {
86+kind: "group",
87+id: "+10000000000",
88+},
89+sender: {
90+id: "222@s.whatsapp.net",
91+},
92+senderAccess: {
93+reasonCode: "group_policy_allowed",
94+},
95+},
8796});
8897}
8998@@ -97,27 +106,27 @@ function mockLoadedImageMedia() {
97106});
98107}
99108100-function mockFirstSendMediaFailure(msg: WebInboundMessage, message: string) {
109+function mockFirstSendMediaFailure(msg: AdmittedWebInboundMessage, message: string) {
101110(
102111msg.platform.sendMedia as unknown as { mockRejectedValueOnce: (v: unknown) => void }
103112).mockRejectedValueOnce(new Error(message));
104113}
105114106-function mockFirstReplyFailure(msg: WebInboundMessage, message: string) {
115+function mockFirstReplyFailure(msg: AdmittedWebInboundMessage, message: string) {
107116(
108117msg.platform.reply as unknown as { mockRejectedValueOnce: (v: unknown) => void }
109118).mockRejectedValueOnce(new Error(message));
110119}
111120112-function mockFirstReplyFailureWithWrappedError(msg: WebInboundMessage, message: string) {
121+function mockFirstReplyFailureWithWrappedError(msg: AdmittedWebInboundMessage, message: string) {
113122(
114123msg.platform.reply as unknown as { mockRejectedValueOnce: (v: unknown) => void }
115124).mockRejectedValueOnce({
116125error: { message },
117126});
118127}
119128120-function expectFirstSendMediaPayload(msg: WebInboundMessage) {
129+function expectFirstSendMediaPayload(msg: AdmittedWebInboundMessage) {
121130const payload = mockCallArg(msg.platform.sendMedia, 0, 0, "sendMedia");
122131if (!payload) {
123132throw new Error("expected first WhatsApp sendMedia payload");
@@ -144,7 +153,7 @@ function mockCallArg(mock: unknown, callIndex: number, argIndex: number, label:
144153return call[argIndex];
145154}
146155147-function replyText(msg: WebInboundMessage, callIndex = 0): string {
156+function replyText(msg: AdmittedWebInboundMessage, callIndex = 0): string {
148157return String(mockCallArg(msg.platform.reply, callIndex, 0, "reply"));
149158}
150159@@ -176,7 +185,7 @@ function expectQuotedOptions(
176185expect(quoted.message).toEqual({ conversation: expected.body });
177186}
178187179-function mockSecondReplySuccess(msg: WebInboundMessage) {
188+function mockSecondReplySuccess(msg: AdmittedWebInboundMessage) {
180189(
181190msg.platform.reply as unknown as { mockResolvedValueOnce: (v: unknown) => void }
182191).mockResolvedValueOnce(createAcceptedWhatsAppSendResult("text", "reply-retry-2"));
@@ -677,23 +686,27 @@ describe("deliverWebReply", () => {
677686vi.clearAllMocks();
678687const msg = makeMsg();
679688// Two media items: first load succeeds and sends, second load succeeds but send fails.
680-(loadWebMedia as unknown as { mockResolvedValueOnce: (v: unknown) => void }).mockResolvedValueOnce({
689+(
690+loadWebMedia as unknown as { mockResolvedValueOnce: (v: unknown) => void }
691+).mockResolvedValueOnce({
681692buffer: Buffer.from("img1"),
682693contentType: "image/jpeg",
683694kind: "image",
684695});
685-(loadWebMedia as unknown as { mockResolvedValueOnce: (v: unknown) => void }).mockResolvedValueOnce({
696+(
697+loadWebMedia as unknown as { mockResolvedValueOnce: (v: unknown) => void }
698+).mockResolvedValueOnce({
686699buffer: Buffer.from("img2"),
687700contentType: "image/jpeg",
688701kind: "image",
689702});
690703// First sendMedia resolves; second sendMedia rejects.
691-(msg.platform.sendMedia as unknown as { mockResolvedValueOnce: (v: unknown) => void }).mockResolvedValueOnce(
692-createAcceptedWhatsAppSendResult("media", "media-first-ok"),
693-);
694-(msg.platform.sendMedia as unknown as { mockRejectedValueOnce: (v: unknown) => void }).mockRejectedValueOnce(
695-new Error("upload failed"),
696-);
704+(
705+msg.platform.sendMedia as unknown as { mockResolvedValueOnce: (v: unknown) => void }
706+).mockResolvedValueOnce(createAcceptedWhatsAppSendResult("media", "media-first-ok"));
707+(
708+msg.platform.sendMedia as unknown as { mockRejectedValueOnce: (v: unknown) => void }
709+).mockRejectedValueOnce(new Error("upload failed"));
697710698711await deliverWebReply({
699712replyResult: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。