






















@@ -20,6 +20,18 @@ afterEach(() => {
2020vi.useRealTimers();
2121});
222223+function requireRecord(value: unknown): Record<string, unknown> {
24+expect(value).toBeTruthy();
25+expect(typeof value).toBe("object");
26+expect(Array.isArray(value)).toBe(false);
27+return value as Record<string, unknown>;
28+}
29+30+function mockCallArg(mock: ReturnType<typeof vi.fn>, index = 0): Record<string, unknown> {
31+const arg = mock.mock.calls[index]?.[0];
32+return requireRecord(arg);
33+}
34+2335describe("deliverApprovalRequestViaChannelNativePlan", () => {
2436it("dedupes converged prepared targets", async () => {
2537const adapter: ChannelApprovalNativeAdapter = {
@@ -165,49 +177,52 @@ describe("createChannelNativeApprovalRuntime", () => {
165177ts: 1,
166178});
167179168-expect(buildPendingContent).toHaveBeenCalledWith({
169-request: expect.objectContaining({ id: "plugin:req-1" }),
170-approvalKind: "plugin",
171-nowMs: expect.any(Number),
172-});
173-expect(prepareTarget).toHaveBeenCalledWith({
174-plannedTarget: {
175-surface: "approver-dm",
176-target: { to: "plugin:secondary" },
177-reason: "preferred",
178-},
179-request: expect.objectContaining({ id: "plugin:req-1" }),
180-approvalKind: "plugin",
181-pendingContent: "pending plugin",
182-});
183-expect(deliverTarget).toHaveBeenCalledWith({
184-plannedTarget: {
185-surface: "approver-dm",
186-target: { to: "plugin:secondary" },
187-reason: "preferred",
188-},
189-preparedTarget: { chatId: "plugin:secondary" },
190-request: expect.objectContaining({ id: "plugin:req-1" }),
191-approvalKind: "plugin",
192-pendingContent: "pending plugin",
193-});
194-expect(describeDeliveryCapabilities).toHaveBeenCalledWith({
195-cfg: {} as never,
196-accountId: "secondary",
197-approvalKind: "plugin",
198-request: expect.objectContaining({ id: "plugin:req-1" }),
180+const pendingCall = mockCallArg(buildPendingContent);
181+expect(requireRecord(pendingCall.request).id).toBe("plugin:req-1");
182+expect(pendingCall.approvalKind).toBe("plugin");
183+expect(typeof pendingCall.nowMs).toBe("number");
184+185+const prepareCall = mockCallArg(prepareTarget);
186+expect(prepareCall.plannedTarget).toEqual({
187+surface: "approver-dm",
188+target: { to: "plugin:secondary" },
189+reason: "preferred",
199190});
200-expect(resolveApproverDmTargets).toHaveBeenCalledWith({
201-cfg: {} as never,
202-accountId: "secondary",
203-approvalKind: "plugin",
204-request: expect.objectContaining({ id: "plugin:req-1" }),
191+expect(requireRecord(prepareCall.request).id).toBe("plugin:req-1");
192+expect(prepareCall.approvalKind).toBe("plugin");
193+expect(prepareCall.pendingContent).toBe("pending plugin");
194+195+const deliverCall = mockCallArg(deliverTarget);
196+expect(deliverCall.plannedTarget).toEqual({
197+surface: "approver-dm",
198+target: { to: "plugin:secondary" },
199+reason: "preferred",
205200});
206-expect(finalizeResolved).toHaveBeenCalledWith({
207-request: expect.objectContaining({ id: "plugin:req-1" }),
208-resolved: expect.objectContaining({ id: "plugin:req-1", decision: "allow-once" }),
209-entries: [{ chatId: "plugin:secondary", messageId: "m1" }],
201+expect(deliverCall.preparedTarget).toEqual({ chatId: "plugin:secondary" });
202+expect(requireRecord(deliverCall.request).id).toBe("plugin:req-1");
203+expect(deliverCall.approvalKind).toBe("plugin");
204+expect(deliverCall.pendingContent).toBe("pending plugin");
205+206+const capabilitiesCall = mockCallArg(describeDeliveryCapabilities);
207+expect(capabilitiesCall.cfg).toEqual({});
208+expect(capabilitiesCall.accountId).toBe("secondary");
209+expect(capabilitiesCall.approvalKind).toBe("plugin");
210+expect(requireRecord(capabilitiesCall.request).id).toBe("plugin:req-1");
211+212+const dmTargetsCall = mockCallArg(resolveApproverDmTargets);
213+expect(dmTargetsCall.cfg).toEqual({});
214+expect(dmTargetsCall.accountId).toBe("secondary");
215+expect(dmTargetsCall.approvalKind).toBe("plugin");
216+expect(requireRecord(dmTargetsCall.request).id).toBe("plugin:req-1");
217+218+const resolvedCall = mockCallArg(finalizeResolved);
219+expect(requireRecord(resolvedCall.request).id).toBe("plugin:req-1");
220+expect(requireRecord(resolvedCall.resolved)).toEqual({
221+id: "plugin:req-1",
222+decision: "allow-once",
223+ts: 1,
210224});
225+expect(resolvedCall.entries).toEqual([{ chatId: "plugin:secondary", messageId: "m1" }]);
211226});
212227213228it("runs expiration through the shared runtime factory", async () => {
@@ -252,10 +267,9 @@ describe("createChannelNativeApprovalRuntime", () => {
252267253268await vi.advanceTimersByTimeAsync(60_000);
254269255-expect(finalizeExpired).toHaveBeenCalledWith({
256-request: expect.objectContaining({ id: "req-1" }),
257-entries: [{ chatId: "owner", messageId: "m1" }],
258-});
270+const expiredCall = mockCallArg(finalizeExpired);
271+expect(requireRecord(expiredCall.request).id).toBe("req-1");
272+expect(expiredCall.entries).toEqual([{ chatId: "owner", messageId: "m1" }]);
259273vi.useRealTimers();
260274});
261275});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。