




















@@ -88,6 +88,29 @@ const runDrySend = (params: {
8888sandboxRoot: params.sandboxRoot,
8989});
909091+function requireRecord(value: unknown): Record<string, unknown> {
92+expect(value).toBeTruthy();
93+expect(typeof value).toBe("object");
94+expect(Array.isArray(value)).toBe(false);
95+return value as Record<string, unknown>;
96+}
97+98+function requireActionPayload(
99+result: Awaited<ReturnType<typeof runMessageAction>>,
100+): Record<string, unknown> {
101+expect(result.kind).toBe("action");
102+if (result.kind !== "action") {
103+throw new Error("expected action result");
104+}
105+return requireRecord(result.payload);
106+}
107+108+function requireLoadWebMediaOptions(): Record<string, unknown> {
109+const call = vi.mocked(loadWebMedia).mock.calls[0];
110+expect(call).toBeTruthy();
111+return requireRecord(call?.[1]);
112+}
113+91114async function expectSandboxMediaRewrite(params: {
92115sandboxDir: string;
93116media?: string;
@@ -136,16 +159,12 @@ async function runAttachmentRemoteMediaAction(params: {
136159}
137160138161function expectAttachmentRemoteMediaPayload(result: Awaited<ReturnType<typeof runMessageAction>>) {
139-expect(result.kind).toBe("action");
140-expect(result.payload).toMatchObject({
141-ok: true,
142-filename: "pic.png",
143-caption: "caption",
144-contentType: "image/png",
145-});
146-expect((result.payload as { buffer?: string }).buffer).toBe(
147-Buffer.from("hello").toString("base64"),
148-);
162+const payload = requireActionPayload(result);
163+expect(payload.ok).toBe(true);
164+expect(payload.filename).toBe("pic.png");
165+expect(payload.caption).toBe("caption");
166+expect(payload.contentType).toBe("image/png");
167+expect(payload.buffer).toBe(Buffer.from("hello").toString("base64"));
149168}
150169151170let actualLoadWebMedia: typeof loadWebMedia;
@@ -256,11 +275,8 @@ describe("runMessageAction media behavior", () => {
256275});
257276258277expect(result.kind).toBe("send");
259-expect(channelResolutionMocks.executeSendAction).toHaveBeenCalledWith(
260-expect.objectContaining({
261-asVoice: true,
262-}),
263-);
278+const sendArgs = requireRecord(channelResolutionMocks.executeSendAction.mock.calls[0]?.[0]);
279+expect(sendArgs.asVoice).toBe(true);
264280});
265281266282describe("sendAttachment hydration", () => {
@@ -373,17 +389,11 @@ describe("runMessageAction media behavior", () => {
373389const result = await runAttachmentRemoteMediaAction({ cfg, action: "sendAttachment" });
374390375391expectAttachmentRemoteMediaPayload(result);
376-const call = vi.mocked(loadWebMedia).mock.calls[0];
377-expect(call?.[1]).toEqual(
378-expect.objectContaining({
379-localRoots: expect.any(Array),
380-readFile: expect.any(Function),
381-hostReadCapability: true,
382-}),
383-);
384-expect((call?.[1] as { sandboxValidated?: boolean } | undefined)?.sandboxValidated).not.toBe(
385-true,
386-);
392+const options = requireLoadWebMediaOptions();
393+expect(Array.isArray(options.localRoots)).toBe(true);
394+expect(typeof options.readFile).toBe("function");
395+expect(options.hostReadCapability).toBe(true);
396+expect(options.sandboxValidated).not.toBe(true);
387397});
388398389399it("allows host-local image attachment paths when fs root expansion is enabled", async () => {
@@ -408,12 +418,10 @@ describe("runMessageAction media behavior", () => {
408418},
409419});
410420411-expect(result.kind).toBe("action");
412-expect(result.payload).toMatchObject({
413-ok: true,
414-filename: "photo.png",
415-contentType: "image/png",
416-});
421+const payload = requireActionPayload(result);
422+expect(payload.ok).toBe(true);
423+expect(payload.filename).toBe("photo.png");
424+expect(payload.contentType).toBe("image/png");
417425} finally {
418426await fs.rm(tempDir, { recursive: true, force: true });
419427}
@@ -505,11 +513,7 @@ describe("runMessageAction media behavior", () => {
505513506514const call = vi.mocked(loadWebMedia).mock.calls[0];
507515expect(call?.[0], testCase.name).toBe(path.join(sandboxDir, testCase.expectedPath));
508-expect(call?.[1], testCase.name).toEqual(
509-expect.objectContaining({
510-sandboxValidated: true,
511-}),
512-);
516+expect(requireRecord(call?.[1]).sandboxValidated, testCase.name).toBe(true);
513517});
514518}
515519@@ -773,12 +777,10 @@ describe("runMessageAction media behavior", () => {
773777sandboxRoot: sandboxDir,
774778});
775779776-expect(result.kind).toBe("action");
777-expect(result.payload).toMatchObject({
778-ok: true,
779-avatarPath: path.join(sandboxDir, "avatars", "profile.png"),
780-avatarUrl: "mxc://matrix.org/abc123def456",
781-});
780+const payload = requireActionPayload(result);
781+expect(payload.ok).toBe(true);
782+expect(payload.avatarPath).toBe(path.join(sandboxDir, "avatars", "profile.png"));
783+expect(payload.avatarUrl).toBe("mxc://matrix.org/abc123def456");
782784});
783785});
784786@@ -800,9 +802,9 @@ describe("runMessageAction media behavior", () => {
800802});
801803802804expect(result.kind).toBe("action");
803-expect((result.payload as { mediaLocalRoots?: string[] }).mediaLocalRoots).toEqual(
804- expect.arrayContaining([tempDir]),
805-);
805+const mediaLocalRoots = requireActionPayload(result).mediaLocalRoots;
806+expect(Array.isArray(mediaLocalRoots)).toBe(true);
807+expect(mediaLocalRoots).toContain(tempDir);
806808} finally {
807809await fs.rm(tempDir, { recursive: true, force: true });
808810}
@@ -828,9 +830,8 @@ describe("runMessageAction media behavior", () => {
828830if (result.kind !== "send") {
829831throw new Error("expected send result");
830832}
831-expect(result.sendResult).toMatchObject({
832-channel: "profile-demo",
833-});
833+expect(result.sendResult).toBeTruthy();
834+expect(result.sendResult?.channel).toBe("profile-demo");
834835});
835836});
836837});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。