























@@ -140,6 +140,18 @@ function requireArray(value: unknown, label: string): Array<unknown> {
140140return value as Array<unknown>;
141141}
142142143+function mockCallArg(
144+mock: { mock: { calls: Array<Array<unknown>> } },
145+label: string,
146+argIndex: number,
147+) {
148+const call = mock.mock.calls.at(0);
149+if (!call) {
150+throw new Error(`expected ${label} call`);
151+}
152+return call[argIndex];
153+}
154+143155function sentContent(sendMessage: { mock: { calls: Array<Array<unknown>> } }, index = 0) {
144156return requireRecord(sendMessage.mock.calls.at(index)?.[1], `sent content ${index}`);
145157}
@@ -219,10 +231,10 @@ describe("sendMessageMatrix media", () => {
219231mediaUrl: "file:///tmp/photo.png",
220232});
221233222-const uploadArg = uploadContent.mock.calls.at(0)?.[0];
234+const uploadArg = mockCallArg(uploadContent, "uploadContent", 0);
223235expect(Buffer.isBuffer(uploadArg)).toBe(true);
224236225-const content = sendMessage.mock.calls.at(0)?.[1] as {
237+const content = sentContent(sendMessage) as {
226238url?: string;
227239msgtype?: string;
228240format?: string;
@@ -243,12 +255,12 @@ describe("sendMessageMatrix media", () => {
243255mediaUrl: "file:///tmp/photo.png",
244256});
245257246-const uploadArg = uploadContent.mock.calls.at(0)?.[0];
258+const uploadArg = mockCallArg(uploadContent, "uploadContent", 0);
247259expect(uploadArg instanceof Uint8Array ? Buffer.from(uploadArg).toString() : undefined).toBe(
248260"encrypted",
249261);
250262251-const content = sendMessage.mock.calls.at(0)?.[1] as {
263+const content = sentContent(sendMessage) as {
252264url?: string;
253265file?: { url?: string };
254266};
@@ -292,7 +304,7 @@ describe("sendMessageMatrix media", () => {
292304expect(isRoomEncrypted).toHaveBeenCalledTimes(1);
293305expect(encryptMedia).toHaveBeenCalledTimes(2);
294306295-const content = sendMessage.mock.calls.at(0)?.[1] as {
307+const content = sentContent(sendMessage) as {
296308url?: string;
297309file?: { url?: string };
298310info?: { thumbnail_url?: string; thumbnail_file?: { url?: string } };
@@ -356,7 +368,7 @@ describe("sendMessageMatrix media", () => {
356368});
357369358370expect(sendMessage).toHaveBeenCalledTimes(1);
359-const mediaContent = sendMessage.mock.calls.at(0)?.[1] as {
371+const mediaContent = sentContent(sendMessage) as {
360372msgtype?: string;
361373body?: string;
362374"org.matrix.msc3245.voice"?: Record<string, never>;
@@ -380,7 +392,7 @@ describe("sendMessageMatrix media", () => {
380392});
381393382394expect(uploadContent).toHaveBeenCalledTimes(2);
383-const content = sendMessage.mock.calls.at(0)?.[1] as {
395+const content = sentContent(sendMessage) as {
384396info?: {
385397thumbnail_url?: string;
386398thumbnail_file?: { url?: string };
@@ -428,8 +440,11 @@ describe("sendMessageMatrix media", () => {
428440});
429441430442expect(loadConfigMock).not.toHaveBeenCalled();
431-expect(loadWebMediaMock.mock.calls.at(0)?.[0]).toBe("file:///tmp/photo.png");
432-const mediaOptions = requireRecord(loadWebMediaMock.mock.calls.at(0)?.[1], "media options");
443+expect(mockCallArg(loadWebMediaMock, "loadWebMedia", 0)).toBe("file:///tmp/photo.png");
444+const mediaOptions = requireRecord(
445+mockCallArg(loadWebMediaMock, "loadWebMedia", 1),
446+"media options",
447+);
433448expect(mediaOptions.maxBytes).toBe(1024 * 1024);
434449expect(mediaOptions.localRoots).toBeUndefined();
435450expect(resolveTextChunkLimitMock).toHaveBeenCalledWith(explicitCfg, "matrix", "ops");
@@ -445,8 +460,11 @@ describe("sendMessageMatrix media", () => {
445460mediaLocalRoots: ["/tmp/openclaw-matrix-test"],
446461});
447462448-expect(loadWebMediaMock.mock.calls.at(0)?.[0]).toBe("file:///tmp/photo.png");
449-const mediaOptions = requireRecord(loadWebMediaMock.mock.calls.at(0)?.[1], "media options");
463+expect(mockCallArg(loadWebMediaMock, "loadWebMedia", 0)).toBe("file:///tmp/photo.png");
464+const mediaOptions = requireRecord(
465+mockCallArg(loadWebMediaMock, "loadWebMedia", 1),
466+"media options",
467+);
450468expect(mediaOptions.maxBytes).toBeUndefined();
451469expect(mediaOptions.localRoots).toEqual(["/tmp/openclaw-matrix-test"]);
452470});
@@ -482,9 +500,9 @@ describe("sendMessageMatrix mentions", () => {
482500expect(sentContent(sendMessage)["m.mentions"]).toEqual({
483501user_ids: ["@alice:example.org"],
484502});
485-expect(
486-(sendMessage.mock.calls.at(0)?.[1] as { formatted_body?: string }).formatted_body,
487-).toContain('href="https://matrix.to/#/%40alice%3Aexample.org"');
503+expect((sentContent(sendMessage) as { formatted_body?: string }).formatted_body).toContain(
504+'href="https://matrix.to/#/%40alice%3Aexample.org"',
505+);
488506});
489507490508it("keeps bare localpart text as plain text", async () => {
@@ -496,9 +514,9 @@ describe("sendMessageMatrix mentions", () => {
496514});
497515498516expect(sentContent(sendMessage)["m.mentions"]).toEqual({});
499-expect(
500-(sendMessage.mock.calls.at(0)?.[1] as { formatted_body?: string }).formatted_body,
501-).not.toContain("matrix.to/#/@alice:example.org");
517+expect((sentContent(sendMessage) as { formatted_body?: string }).formatted_body).not.toContain(
518+"matrix.to/#/@alice:example.org",
519+);
502520});
503521504522it("does not emit mentions for escaped qualified users", async () => {
@@ -510,9 +528,9 @@ describe("sendMessageMatrix mentions", () => {
510528});
511529512530expect(sentContent(sendMessage)["m.mentions"]).toEqual({});
513-expect(
514-(sendMessage.mock.calls.at(0)?.[1] as { formatted_body?: string }).formatted_body,
515-).not.toContain("matrix.to/#/@alice:example.org");
531+expect((sentContent(sendMessage) as { formatted_body?: string }).formatted_body).not.toContain(
532+"matrix.to/#/@alice:example.org",
533+);
516534});
517535518536it("does not emit mentions for escaped room mentions", async () => {
@@ -569,7 +587,7 @@ describe("sendMessageMatrix mentions", () => {
569587expect(sentContent(sendMessage).body).toBe("@room.png");
570588expect(sentContent(sendMessage)["m.mentions"]).toEqual({});
571589expect(
572-(sendMessage.mock.calls.at(0)?.[1] as { formatted_body?: string }).formatted_body,
590+(sentContent(sendMessage) as { formatted_body?: string }).formatted_body,
573591).toBeUndefined();
574592});
575593});
@@ -589,7 +607,7 @@ describe("sendMessageMatrix threads", () => {
589607threadId: "$thread",
590608});
591609592-const content = sendMessage.mock.calls.at(0)?.[1] as {
610+const content = sentContent(sendMessage) as {
593611"m.relates_to"?: {
594612rel_type?: string;
595613event_id?: string;
@@ -697,10 +715,10 @@ describe("sendSingleTextMessageMatrix", () => {
697715698716expect(sentContent(sendMessage).msgtype).toBe("m.notice");
699717expect(sentContent(sendMessage).body).toBe("@room hi @alice:example.org");
700-expect(sendMessage.mock.calls.at(0)?.[1]).not.toHaveProperty("m.mentions");
701-expect(
702-(sendMessage.mock.calls.at(0)?.[1] as { formatted_body?: string }).formatted_body,
703-).not.toContain("matrix.to");
718+expect(sentContent(sendMessage)).not.toHaveProperty("m.mentions");
719+expect((sentContent(sendMessage) as { formatted_body?: string }).formatted_body).not.toContain(
720+"matrix.to",
721+);
704722});
705723706724it("does not activate mentions inside Matrix tool-progress code spans", async () => {
@@ -719,8 +737,7 @@ describe("sendSingleTextMessageMatrix", () => {
719737"Working...\n- `@room ping @alice:example.org !room:example.org`",
720738);
721739expect(sentContent(sendMessage)["m.mentions"]).toEqual({});
722-const formattedBody = (sendMessage.mock.calls.at(0)?.[1] as { formatted_body?: string })
723-.formatted_body;
740+const formattedBody = (sentContent(sendMessage) as { formatted_body?: string }).formatted_body;
724741expect(formattedBody).toContain("<code>@room ping @alice:example.org !room:example.org</code>");
725742expect(formattedBody).not.toContain("matrix.to");
726743});
@@ -834,12 +851,12 @@ describe("editMessageMatrix mentions", () => {
834851expect(newContent(content).msgtype).toBe("m.notice");
835852expect(content).not.toHaveProperty("m.mentions");
836853expect(newContent(content)).not.toHaveProperty("m.mentions");
837-expect(
838-(sendMessage.mock.calls.at(0)?.[1] as { formatted_body?: string }).formatted_body,
839-).not.toContain("matrix.to");
854+expect((sentContent(sendMessage) as { formatted_body?: string }).formatted_body).not.toContain(
855+"matrix.to",
856+);
840857expect(
841858(
842-sendMessage.mock.calls.at(0)?.[1] as {
859+sentContent(sendMessage) as {
843860"m.new_content"?: { formatted_body?: string };
844861}
845862)["m.new_content"]?.formatted_body,
@@ -882,9 +899,9 @@ describe("sendPollMatrix mentions", () => {
882899},
883900);
884901885-expect(sendEvent.mock.calls.at(0)?.[0]).toBe("!room:example");
886-expect(sendEvent.mock.calls.at(0)?.[1]).toBe("m.poll.start");
887-const content = requireRecord(sendEvent.mock.calls.at(0)?.[2], "poll start content");
902+expect(mockCallArg(sendEvent, "sendEvent", 0)).toBe("!room:example");
903+expect(mockCallArg(sendEvent, "sendEvent", 1)).toBe("m.poll.start");
904+const content = requireRecord(mockCallArg(sendEvent, "sendEvent", 2), "poll start content");
888905expect(content["m.mentions"]).toEqual({
889906room: true,
890907user_ids: ["@alice:example.org"],
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。