


























@@ -186,11 +186,21 @@ function deliveryCall(index = 0): Record<string, any> | undefined {
186186187187function firstRespondCall(respond: ReturnType<typeof vi.fn>) {
188188const calls = respond.mock.calls as unknown as Array<
189-[boolean, Record<string, any>, unknown, Record<string, any>]
189+[
190+boolean,
191+Record<string, any> | undefined,
192+Record<string, any> | undefined,
193+Record<string, any> | undefined,
194+]
190195>;
191196return calls[0];
192197}
193198199+function pollCall(index = 0): Record<string, any> | undefined {
200+const calls = mocks.sendPoll.mock.calls as unknown as Array<[Record<string, any>]>;
201+return calls[index]?.[0];
202+}
203+194204function expectDeliverySessionMirror(params: { agentId: string; sessionKey: string }) {
195205const call = deliveryCall();
196206expect(call?.session?.agentId).toBe(params.agentId);
@@ -315,12 +325,8 @@ describe("gateway send mirroring", () => {
315325{ connect: { scopes: ["operator.write"] } },
316326);
317327318-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
319-expect.objectContaining({
320-channel: "slack",
321-gatewayClientScopes: ["operator.write"],
322-}),
323-);
328+expect(deliveryCall()?.channel).toBe("slack");
329+expect(deliveryCall()?.gatewayClientScopes).toEqual(["operator.write"]);
324330});
325331326332it("forwards an empty gateway scope array into outbound delivery", async () => {
@@ -336,12 +342,8 @@ describe("gateway send mirroring", () => {
336342{ connect: { scopes: [] } },
337343);
338344339-expect(mocks.deliverOutboundPayloads).toHaveBeenCalledWith(
340-expect.objectContaining({
341-channel: "slack",
342-gatewayClientScopes: [],
343-}),
344-);
345+expect(deliveryCall()?.channel).toBe("slack");
346+expect(deliveryCall()?.gatewayClientScopes).toEqual([]);
345347});
346348347349it("rejects empty sends when neither text nor media is present", async () => {
@@ -353,13 +355,10 @@ describe("gateway send mirroring", () => {
353355});
354356355357expect(mocks.deliverOutboundPayloads).not.toHaveBeenCalled();
356-expect(respond).toHaveBeenCalledWith(
357-false,
358-undefined,
359-expect.objectContaining({
360-message: expect.stringContaining("text or media is required"),
361-}),
362-);
358+const response = firstRespondCall(respond);
359+expect(response?.[0]).toBe(false);
360+expect(response?.[1]).toBeUndefined();
361+expect(response?.[2]?.message).toContain("text or media is required");
363362});
364363365364it("returns actionable guidance when channel is internal webchat", async () => {
@@ -371,20 +370,11 @@ describe("gateway send mirroring", () => {
371370});
372371373372expect(mocks.deliverOutboundPayloads).not.toHaveBeenCalled();
374-expect(respond).toHaveBeenCalledWith(
375-false,
376-undefined,
377-expect.objectContaining({
378-message: expect.stringContaining("unsupported channel: webchat"),
379-}),
380-);
381-expect(respond).toHaveBeenCalledWith(
382-false,
383-undefined,
384-expect.objectContaining({
385-message: expect.stringContaining("Use `chat.send`"),
386-}),
387-);
373+const response = firstRespondCall(respond);
374+expect(response?.[0]).toBe(false);
375+expect(response?.[1]).toBeUndefined();
376+expect(response?.[2]?.message).toContain("unsupported channel: webchat");
377+expect(response?.[2]?.message).toContain("Use `chat.send`");
388378});
389379390380it("auto-picks the single configured channel for send", async () => {
@@ -398,12 +388,11 @@ describe("gateway send mirroring", () => {
398388399389expect(mocks.resolveMessageChannelSelection).toHaveBeenCalled();
400390expect(mocks.deliverOutboundPayloads).toHaveBeenCalled();
401-expect(respond).toHaveBeenCalledWith(
402-true,
403-expect.objectContaining({ messageId: "m-single-send" }),
404-undefined,
405-expect.objectContaining({ channel: "slack" }),
406-);
391+const response = firstRespondCall(respond);
392+expect(response?.[0]).toBe(true);
393+expect(response?.[1]?.messageId).toBe("m-single-send");
394+expect(response?.[2]).toBeUndefined();
395+expect(response?.[3]?.channel).toBe("slack");
407396});
408397409398it("auto-picks the single configured channel from the auto-enabled config snapshot for send", async () => {
@@ -428,12 +417,11 @@ describe("gateway send mirroring", () => {
428417expect(mocks.resolveMessageChannelSelection).toHaveBeenCalledWith({
429418cfg: autoEnabledConfig,
430419});
431-expect(respond).toHaveBeenCalledWith(
432-true,
433-expect.objectContaining({ messageId: "m-single-send-auto" }),
434-undefined,
435-expect.objectContaining({ channel: "slack" }),
436-);
420+const response = firstRespondCall(respond);
421+expect(response?.[0]).toBe(true);
422+expect(response?.[1]?.messageId).toBe("m-single-send-auto");
423+expect(response?.[2]).toBeUndefined();
424+expect(response?.[3]?.channel).toBe("slack");
437425});
438426439427it("returns invalid request when send channel selection is ambiguous", async () => {
@@ -448,13 +436,10 @@ describe("gateway send mirroring", () => {
448436});
449437450438expect(mocks.deliverOutboundPayloads).not.toHaveBeenCalled();
451-expect(respond).toHaveBeenCalledWith(
452-false,
453-undefined,
454-expect.objectContaining({
455-message: expect.stringContaining("Channel is required"),
456-}),
457-);
439+const response = firstRespondCall(respond);
440+expect(response?.[0]).toBe(false);
441+expect(response?.[1]).toBeUndefined();
442+expect(response?.[2]?.message).toContain("Channel is required");
458443});
459444460445it("forwards gateway client scopes into outbound poll delivery", async () => {
@@ -469,13 +454,9 @@ describe("gateway send mirroring", () => {
469454{ connect: { scopes: ["operator.admin"] } },
470455);
471456472-expect(mocks.sendPoll).toHaveBeenCalledWith(
473-expect.objectContaining({
474-cfg: expect.any(Object),
475-to: "resolved",
476-gatewayClientScopes: ["operator.admin"],
477-}),
478-);
457+expect(pollCall()?.cfg).toBeDefined();
458+expect(pollCall()?.to).toBe("resolved");
459+expect(pollCall()?.gatewayClientScopes).toEqual(["operator.admin"]);
479460});
480461481462it("forwards an empty gateway scope array into outbound poll delivery", async () => {
@@ -490,13 +471,9 @@ describe("gateway send mirroring", () => {
490471{ connect: { scopes: [] } },
491472);
492473493-expect(mocks.sendPoll).toHaveBeenCalledWith(
494-expect.objectContaining({
495-cfg: expect.any(Object),
496-to: "resolved",
497-gatewayClientScopes: [],
498-}),
499-);
474+expect(pollCall()?.cfg).toBeDefined();
475+expect(pollCall()?.to).toBe("resolved");
476+expect(pollCall()?.gatewayClientScopes).toEqual([]);
500477});
501478502479it("includes optional poll delivery identifiers in the gateway payload", async () => {
@@ -516,20 +493,19 @@ describe("gateway send mirroring", () => {
516493idempotencyKey: "idem-poll-rich",
517494});
518495519-expect(respond).toHaveBeenCalledWith(
520-true,
521-expect.objectContaining({
522-runId: "idem-poll-rich",
523-messageId: "poll-rich",
524-channel: "slack",
525-channelId: "C123",
526-conversationId: "conv-1",
527-toJid: "jid-1",
528-pollId: "poll-meta-1",
529-}),
530-undefined,
531-expect.objectContaining({ channel: "slack" }),
532-);
496+const response = firstRespondCall(respond);
497+expect(response?.[0]).toBe(true);
498+expect(response?.[1]).toEqual({
499+runId: "idem-poll-rich",
500+messageId: "poll-rich",
501+channel: "slack",
502+channelId: "C123",
503+conversationId: "conv-1",
504+toJid: "jid-1",
505+pollId: "poll-meta-1",
506+});
507+expect(response?.[2]).toBeUndefined();
508+expect(response?.[3]?.channel).toBe("slack");
533509});
534510535511it("auto-picks the single configured channel for poll", async () => {
@@ -541,9 +517,11 @@ describe("gateway send mirroring", () => {
541517});
542518543519expect(mocks.resolveMessageChannelSelection).toHaveBeenCalled();
544-expect(respond).toHaveBeenCalledWith(true, expect.any(Object), undefined, {
545-channel: "slack",
546-});
520+const response = firstRespondCall(respond);
521+expect(response?.[0]).toBe(true);
522+expect(response?.[1]).toBeDefined();
523+expect(response?.[2]).toBeUndefined();
524+expect(response?.[3]).toEqual({ channel: "slack" });
547525});
548526549527it("returns invalid request when poll channel selection is ambiguous", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。