






















@@ -211,6 +211,13 @@ function firstRespondCall(respond: ReturnType<typeof vi.fn>) {
211211return calls[0];
212212}
213213214+function lastDispatchChannelMessageActionCall(): Record<string, any> | undefined {
215+const calls = mocks.dispatchChannelMessageAction.mock.calls as unknown as Array<
216+[Record<string, any>]
217+>;
218+return calls.at(-1)?.[0];
219+}
220+214221function pollCall(index = 0): Record<string, any> | undefined {
215222const calls = mocks.sendPoll.mock.calls as unknown as Array<[Record<string, any>]>;
216223return calls[index]?.[0];
@@ -323,18 +330,20 @@ describe("gateway send mirroring", () => {
323330await Promise.all([firstRequest, secondRequest]);
324331325332expect(mocks.dispatchChannelMessageAction).toHaveBeenCalledTimes(1);
326-expect(firstRespond).toHaveBeenCalledWith(
327-true,
328-{ action: "handled" },
329-undefined,
330-expect.objectContaining({ channel: "slack" }),
331-);
332-expect(secondRespond).toHaveBeenCalledWith(
333-true,
334-{ action: "handled" },
335-undefined,
336-expect.objectContaining({ channel: "slack", cached: true }),
337-);
333+expect(firstRespond).toHaveBeenCalledTimes(1);
334+expect(secondRespond).toHaveBeenCalledTimes(1);
335+const firstCall = firstRespondCall(firstRespond);
336+expect(firstCall?.[0]).toBe(true);
337+expect(firstCall?.[1]).toEqual({ action: "handled" });
338+expect(firstCall?.[2]).toBeUndefined();
339+expect(firstCall?.[3]?.channel).toBe("slack");
340+expect(firstCall?.[3]?.cached).toBeUndefined();
341+const secondCall = firstRespondCall(secondRespond);
342+expect(secondCall?.[0]).toBe(true);
343+expect(secondCall?.[1]).toEqual({ action: "handled" });
344+expect(secondCall?.[2]).toBeUndefined();
345+expect(secondCall?.[3]?.channel).toBe("slack");
346+expect(secondCall?.[3]?.cached).toBe(true);
338347});
339348340349it("dedupes concurrent send requests while inflight", async () => {
@@ -380,18 +389,22 @@ describe("gateway send mirroring", () => {
380389await Promise.all([firstRequest, secondRequest]);
381390382391expect(mocks.deliverOutboundPayloads).toHaveBeenCalledTimes(1);
383-expect(firstRespond).toHaveBeenCalledWith(
384-true,
385-expect.objectContaining({ messageId: "m-concurrent", runId: "idem-send-concurrent" }),
386-undefined,
387-expect.objectContaining({ channel: "slack" }),
388-);
389-expect(secondRespond).toHaveBeenCalledWith(
390-true,
391-expect.objectContaining({ messageId: "m-concurrent", runId: "idem-send-concurrent" }),
392-undefined,
393-expect.objectContaining({ channel: "slack", cached: true }),
394-);
392+expect(firstRespond).toHaveBeenCalledTimes(1);
393+expect(secondRespond).toHaveBeenCalledTimes(1);
394+const firstCall = firstRespondCall(firstRespond);
395+expect(firstCall?.[0]).toBe(true);
396+expect(firstCall?.[1]?.messageId).toBe("m-concurrent");
397+expect(firstCall?.[1]?.runId).toBe("idem-send-concurrent");
398+expect(firstCall?.[2]).toBeUndefined();
399+expect(firstCall?.[3]?.channel).toBe("slack");
400+expect(firstCall?.[3]?.cached).toBeUndefined();
401+const secondCall = firstRespondCall(secondRespond);
402+expect(secondCall?.[0]).toBe(true);
403+expect(secondCall?.[1]?.messageId).toBe("m-concurrent");
404+expect(secondCall?.[1]?.runId).toBe("idem-send-concurrent");
405+expect(secondCall?.[2]).toBeUndefined();
406+expect(secondCall?.[3]?.channel).toBe("slack");
407+expect(secondCall?.[3]?.cached).toBe(true);
395408});
396409397410it("dedupes concurrent poll requests while inflight", async () => {
@@ -438,26 +451,24 @@ describe("gateway send mirroring", () => {
438451await Promise.all([firstRequest, secondRequest]);
439452440453expect(mocks.sendPoll).toHaveBeenCalledTimes(1);
441-expect(firstRespond).toHaveBeenCalledWith(
442-true,
443-expect.objectContaining({
444-messageId: "poll-concurrent",
445-pollId: "poll-1",
446-runId: "idem-poll-concurrent",
447-}),
448-undefined,
449-expect.objectContaining({ channel: "slack" }),
450-);
451-expect(secondRespond).toHaveBeenCalledWith(
452-true,
453-expect.objectContaining({
454-messageId: "poll-concurrent",
455-pollId: "poll-1",
456-runId: "idem-poll-concurrent",
457-}),
458-undefined,
459-expect.objectContaining({ channel: "slack", cached: true }),
460-);
454+expect(firstRespond).toHaveBeenCalledTimes(1);
455+expect(secondRespond).toHaveBeenCalledTimes(1);
456+const firstCall = firstRespondCall(firstRespond);
457+expect(firstCall?.[0]).toBe(true);
458+expect(firstCall?.[1]?.messageId).toBe("poll-concurrent");
459+expect(firstCall?.[1]?.pollId).toBe("poll-1");
460+expect(firstCall?.[1]?.runId).toBe("idem-poll-concurrent");
461+expect(firstCall?.[2]).toBeUndefined();
462+expect(firstCall?.[3]?.channel).toBe("slack");
463+expect(firstCall?.[3]?.cached).toBeUndefined();
464+const secondCall = firstRespondCall(secondRespond);
465+expect(secondCall?.[0]).toBe(true);
466+expect(secondCall?.[1]?.messageId).toBe("poll-concurrent");
467+expect(secondCall?.[1]?.pollId).toBe("poll-1");
468+expect(secondCall?.[1]?.runId).toBe("idem-poll-concurrent");
469+expect(secondCall?.[2]).toBeUndefined();
470+expect(secondCall?.[3]?.channel).toBe("slack");
471+expect(secondCall?.[3]?.cached).toBe(true);
461472});
462473463474it("accepts media-only sends without message", async () => {
@@ -1303,11 +1314,8 @@ describe("gateway send mirroring", () => {
13031314});
1304131513051316expect(firstRespondCall(respond)?.[0]).toBe(true);
1306-expect(mocks.dispatchChannelMessageAction).toHaveBeenLastCalledWith(
1307-expect.objectContaining({
1308-mediaLocalRoots: expect.arrayContaining([TEST_AGENT_WORKSPACE]),
1309-}),
1310-);
1317+const actionCall = lastDispatchChannelMessageActionCall();
1318+expect(actionCall?.mediaLocalRoots).toContain(TEST_AGENT_WORKSPACE);
13111319});
1312132013131321it("forces senderIsOwner=false for narrowly-scoped callers but honors it for full operators", async () => {
@@ -1356,9 +1364,7 @@ describe("gateway send mirroring", () => {
13561364},
13571365{ connect: { scopes: ["operator.write"] } },
13581366);
1359-expect(mocks.dispatchChannelMessageAction).toHaveBeenLastCalledWith(
1360-expect.objectContaining({ senderIsOwner: false }),
1361-);
1367+expect(lastDispatchChannelMessageActionCall()?.senderIsOwner).toBe(false);
1362136813631369// Full operator (admin-scoped): the trusted runtime is allowed to
13641370// forward the real channel-sender ownership bit. Wire true → true.
@@ -1376,9 +1382,7 @@ describe("gateway send mirroring", () => {
13761382},
13771383{ connect: { scopes: ["operator.admin"] } },
13781384);
1379-expect(mocks.dispatchChannelMessageAction).toHaveBeenLastCalledWith(
1380-expect.objectContaining({ senderIsOwner: true }),
1381-);
1385+expect(lastDispatchChannelMessageActionCall()?.senderIsOwner).toBe(true);
1382138613831387// Full operator forwarding a non-owner sender: wire false → false
13841388// (admin scope does not inflate ownership on its own).
@@ -1396,8 +1400,6 @@ describe("gateway send mirroring", () => {
13961400},
13971401{ connect: { scopes: ["operator.admin"] } },
13981402);
1399-expect(mocks.dispatchChannelMessageAction).toHaveBeenLastCalledWith(
1400-expect.objectContaining({ senderIsOwner: false }),
1401-);
1403+expect(lastDispatchChannelMessageActionCall()?.senderIsOwner).toBe(false);
14021404});
14031405});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。