




















@@ -98,6 +98,53 @@ function mockReplayLists(params: {
9898});
9999}
100100101+function expectStartGatewayClientCall(preauthHandshakeTimeoutMs?: number) {
102+expect(mockStartGatewayClientWhenEventLoopReady).toHaveBeenCalledTimes(1);
103+const [client, options] = mockStartGatewayClientWhenEventLoopReady.mock.calls[0] ?? [];
104+expect(typeof (client as { start?: unknown } | undefined)?.start).toBe("function");
105+expect(options).toEqual({
106+clientOptions: { preauthHandshakeTimeoutMs },
107+});
108+}
109+110+function expectFinalizedExpired(
111+finalizedExpired: ReturnType<typeof vi.fn>,
112+params: { id: string; entries: Array<{ id: string }> },
113+) {
114+expect(finalizedExpired).toHaveBeenCalledTimes(1);
115+const payload = finalizedExpired.mock.calls[0]?.[0] as
116+| { request?: { id?: string }; entries?: Array<{ id: string }> }
117+| undefined;
118+expect(payload?.request?.id).toBe(params.id);
119+expect(payload?.entries).toEqual(params.entries);
120+}
121+122+function expectFinalizedResolved(
123+finalizedResolved: ReturnType<typeof vi.fn>,
124+params: { id: string; decision: string; entries: Array<{ id: string }> },
125+) {
126+expect(finalizedResolved).toHaveBeenCalledTimes(1);
127+const payload = finalizedResolved.mock.calls[0]?.[0] as
128+| {
129+request?: { id?: string };
130+resolved?: { id?: string; decision?: string };
131+entries?: Array<{ id: string }>;
132+}
133+| undefined;
134+expect(payload?.request?.id).toBe(params.id);
135+expect(payload?.resolved?.id).toBe(params.id);
136+expect(payload?.resolved?.decision).toBe(params.decision);
137+expect(payload?.entries).toEqual(params.entries);
138+}
139+140+function expectDeliveredRequestId(deliverRequested: ReturnType<typeof vi.fn>, id: string) {
141+expect(
142+deliverRequested.mock.calls.some(
143+([request]) => (request as { id?: unknown } | undefined)?.id === id,
144+),
145+).toBe(true);
146+}
147+101148beforeEach(() => {
102149mockGatewayClientStarts.mockReset();
103150mockGatewayClientStops.mockReset();
@@ -185,11 +232,7 @@ describe("createExecApprovalChannelRuntime", () => {
185232186233await runtime.handleExpired("abc");
187234188-expect(finalizedExpired).toHaveBeenCalledTimes(1);
189-expect(finalizedExpired).toHaveBeenCalledWith({
190-request: expect.objectContaining({ id: "abc" }),
191-entries: [{ id: "abc" }],
192-});
235+expectFinalizedExpired(finalizedExpired, { id: "abc", entries: [{ id: "abc" }] });
193236expect(finalizedResolved).not.toHaveBeenCalled();
194237195238await runtime.handleResolved({
@@ -198,10 +241,9 @@ describe("createExecApprovalChannelRuntime", () => {
198241ts: 1500,
199242});
200243201-expect(finalizedResolved).toHaveBeenCalledTimes(1);
202-expect(finalizedResolved).toHaveBeenCalledWith({
203-request: expect.objectContaining({ id: "xyz" }),
204-resolved: expect.objectContaining({ id: "xyz", decision: "allow-once" }),
244+expectFinalizedResolved(finalizedResolved, {
245+id: "xyz",
246+decision: "allow-once",
205247entries: [{ id: "xyz" }],
206248});
207249});
@@ -242,9 +284,9 @@ describe("createExecApprovalChannelRuntime", () => {
242284pendingDelivery.resolve([{ id: "plugin:abc" }]);
243285await requestPromise;
244286245-expect(finalizeResolved).toHaveBeenCalledWith({
246-request: expect.objectContaining({ id: "plugin:abc" }),
247-resolved: expect.objectContaining({ id: "plugin:abc", decision: "allow-once" }),
287+expectFinalizedResolved(finalizeResolved, {
288+id: "plugin:abc",
289+decision: "allow-once",
248290entries: [{ id: "plugin:abc" }],
249291});
250292});
@@ -264,12 +306,7 @@ describe("createExecApprovalChannelRuntime", () => {
264306await runtime.request("exec.approval.resolve", { id: "abc", decision: "deny" });
265307266308expect(mockGatewayClientStarts).toHaveBeenCalledTimes(1);
267-expect(mockStartGatewayClientWhenEventLoopReady).toHaveBeenCalledWith(
268-expect.objectContaining({ start: expect.any(Function) }),
269-{
270-clientOptions: { preauthHandshakeTimeoutMs: undefined },
271-},
272-);
309+expectStartGatewayClientCall();
273310expect(mockGatewayClientRequests).toHaveBeenCalledWith("exec.approval.resolve", {
274311id: "abc",
275312decision: "deny",
@@ -300,12 +337,7 @@ describe("createExecApprovalChannelRuntime", () => {
300337301338expect(mockGatewayClientStarts).not.toHaveBeenCalled();
302339expect(mockGatewayClientStops).toHaveBeenCalledTimes(1);
303-expect(mockStartGatewayClientWhenEventLoopReady).toHaveBeenCalledWith(
304-expect.objectContaining({ start: expect.any(Function) }),
305-{
306-clientOptions: { preauthHandshakeTimeoutMs: 30_000 },
307-},
308-);
340+expectStartGatewayClientCall(30_000);
309341});
310342311343it("can retry start after gateway client creation fails", async () => {
@@ -409,9 +441,7 @@ describe("createExecApprovalChannelRuntime", () => {
409441});
410442411443expect(caught).toBeInstanceOf(ExecApprovalChannelRuntimeTerminalStartError);
412-expect(caught).toMatchObject({
413-detailCode: "PAIRING_REQUIRED",
414-});
444+expect((caught as { detailCode?: string }).detailCode).toBe("PAIRING_REQUIRED");
415445416446expect(mockGatewayClientStarts).toHaveBeenCalledTimes(1);
417447expect(mockGatewayClientStops).toHaveBeenCalledTimes(1);
@@ -536,11 +566,7 @@ describe("createExecApprovalChannelRuntime", () => {
536566537567emitPluginApprovalRequested(clientParams);
538568await vi.waitFor(() => {
539-expect(deliverRequested).toHaveBeenCalledWith(
540-expect.objectContaining({
541-id: "plugin:abc",
542-}),
543-);
569+expectDeliveredRequestId(deliverRequested, "plugin:abc");
544570});
545571546572clientParams?.onEvent?.({
@@ -552,9 +578,9 @@ describe("createExecApprovalChannelRuntime", () => {
552578},
553579});
554580await vi.waitFor(() => {
555-expect(finalizeResolved).toHaveBeenCalledWith({
556-request: expect.objectContaining({ id: "plugin:abc" }),
557-resolved: expect.objectContaining({ id: "plugin:abc", decision: "allow-once" }),
581+expectFinalizedResolved(finalizeResolved, {
582+id: "plugin:abc",
583+decision: "allow-once",
558584entries: [{ id: "plugin:abc" }],
559585});
560586});
@@ -577,11 +603,7 @@ describe("createExecApprovalChannelRuntime", () => {
577603578604await vi.waitFor(() => {
579605expect(mockGatewayClientRequests).toHaveBeenCalledWith("exec.approval.list", {});
580-expect(deliverRequested).toHaveBeenCalledWith(
581-expect.objectContaining({
582-id: "abc",
583-}),
584-);
606+expectDeliveredRequestId(deliverRequested, "abc");
585607});
586608});
587609@@ -603,11 +625,7 @@ describe("createExecApprovalChannelRuntime", () => {
603625await runtime.start();
604626605627await vi.waitFor(() => {
606-expect(deliverRequested).toHaveBeenCalledWith(
607-expect.objectContaining({
608-id: "abc",
609-}),
610-);
628+expectDeliveredRequestId(deliverRequested, "abc");
611629});
612630pendingDelivery.resolve([{ id: "abc" }]);
613631await runtime.stop();
@@ -839,9 +857,9 @@ describe("createExecApprovalChannelRuntime", () => {
839857ts: 1500,
840858});
841859842-expect(finalizeResolved).toHaveBeenCalledWith({
843-request: expect.objectContaining({ id: "abc" }),
844-resolved: expect.objectContaining({ id: "abc", decision: "allow-once" }),
860+expectFinalizedResolved(finalizeResolved, {
861+id: "abc",
862+decision: "allow-once",
845863entries: [{ id: "abc" }],
846864});
847865});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。