


































@@ -119,6 +119,29 @@ function createSecretsApplyResult(options?: {
119119};
120120}
121121122+function mockCall(mock: unknown, index = 0): Array<unknown> {
123+const calls = (mock as { mock?: { calls?: Array<Array<unknown>> } }).mock?.calls ?? [];
124+const call = calls.at(index);
125+expect(call, `mock call ${index + 1}`).toBeDefined();
126+return call as Array<unknown>;
127+}
128+129+function mockFirstObjectArg(mock: unknown): Record<string, unknown> {
130+const [arg] = mockCall(mock);
131+expect(arg).toBeTypeOf("object");
132+expect(arg).not.toBeNull();
133+return arg as Record<string, unknown>;
134+}
135+136+function expectObjectFields(value: unknown, expected: Record<string, unknown>): void {
137+expect(value).toBeTypeOf("object");
138+expect(value).not.toBeNull();
139+const record = value as Record<string, unknown>;
140+for (const [key, expectedValue] of Object.entries(expected)) {
141+expect(record[key], key).toEqual(expectedValue);
142+}
143+}
144+122145async function withPlanFile(run: (planPath: string) => Promise<void>) {
123146const planPath = path.join(
124147os.tmpdir(),
@@ -159,12 +182,11 @@ describe("secrets CLI", () => {
159182it("calls secrets.reload and prints human output", async () => {
160183callGatewayFromCli.mockResolvedValue({ ok: true, warningCount: 1 });
161184await createProgram().parseAsync(["secrets", "reload"], { from: "user" });
162-expect(callGatewayFromCli).toHaveBeenCalledWith(
163-"secrets.reload",
164-expect.anything(),
165-undefined,
166-expect.objectContaining({ expectFinal: false }),
167-);
185+const reloadCall = mockCall(callGatewayFromCli);
186+expect(reloadCall[0]).toBe("secrets.reload");
187+expect(reloadCall[1]).toBeDefined();
188+expect(reloadCall[2]).toBeUndefined();
189+expectObjectFields(reloadCall[3], { expectFinal: false });
168190expect(runtimeLogs.at(-1)).toBe("Secrets reloaded with 1 warning(s).");
169191expect(runtimeErrors).toHaveLength(0);
170192});
@@ -217,12 +239,10 @@ describe("secrets CLI", () => {
217239await expect(
218240createProgram().parseAsync(["secrets", "audit", "--check"], { from: "user" }),
219241).rejects.toThrow("__exit__:2");
220-expect(runSecretsAudit).toHaveBeenCalledWith(
221-expect.objectContaining({
222-allowExec: false,
223-}),
224-);
225-expect(resolveSecretsAuditExitCode).toHaveBeenCalledWith(expect.anything(), true);
242+expect(mockFirstObjectArg(runSecretsAudit).allowExec).toBe(false);
243+const exitCodeCall = mockCall(resolveSecretsAuditExitCode);
244+expect(exitCodeCall[0]).toBeDefined();
245+expect(exitCodeCall[1]).toBe(true);
226246});
227247228248it("forwards --allow-exec to secrets audit", async () => {
@@ -246,11 +266,7 @@ describe("secrets CLI", () => {
246266resolveSecretsAuditExitCode.mockReturnValue(0);
247267248268await createProgram().parseAsync(["secrets", "audit", "--allow-exec"], { from: "user" });
249-expect(runSecretsAudit).toHaveBeenCalledWith(
250-expect.objectContaining({
251-allowExec: true,
252-}),
253-);
269+expect(mockFirstObjectArg(runSecretsAudit).allowExec).toBe(true);
254270});
255271256272it("runs secrets configure then apply when confirmed", async () => {
@@ -276,19 +292,17 @@ describe("secrets CLI", () => {
276292277293await createProgram().parseAsync(["secrets", "configure"], { from: "user" });
278294expect(runSecretsConfigureInteractive).toHaveBeenCalled();
279-expect(runSecretsApply).toHaveBeenCalledWith(
280-expect.objectContaining({
281-write: true,
282-plan: expect.objectContaining({
283-targets: expect.arrayContaining([
284-expect.objectContaining({
285-type: "skills.entries.apiKey",
286-path: "skills.entries.qa-secret-test.apiKey",
287-}),
288-]),
289-}),
290-}),
291-);
295+const applyArgs = mockFirstObjectArg(runSecretsApply);
296+expect(applyArgs.write).toBe(true);
297+expect(applyArgs.plan).toBeTypeOf("object");
298+expect(applyArgs.plan).not.toBeNull();
299+const applyPlan = applyArgs.plan as { targets?: unknown[] };
300+expect(Array.isArray(applyPlan.targets)).toBe(true);
301+const [target] = applyPlan.targets ?? [];
302+expectObjectFields(target, {
303+type: "skills.entries.apiKey",
304+path: "skills.entries.qa-secret-test.apiKey",
305+});
292306expect(runtimeLogs.at(-1)).toContain("Secrets applied");
293307});
294308@@ -297,12 +311,10 @@ describe("secrets CLI", () => {
297311confirm.mockResolvedValue(false);
298312299313await createProgram().parseAsync(["secrets", "configure", "--agent", "ops"], { from: "user" });
300-expect(runSecretsConfigureInteractive).toHaveBeenCalledWith(
301-expect.objectContaining({
302-agentId: "ops",
303-allowExecInPreflight: false,
304-}),
305-);
314+expectObjectFields(mockFirstObjectArg(runSecretsConfigureInteractive), {
315+agentId: "ops",
316+allowExecInPreflight: false,
317+});
306318});
307319308320it("forwards --allow-exec to secrets apply dry-run", async () => {
@@ -315,12 +327,10 @@ describe("secrets CLI", () => {
315327from: "user",
316328},
317329);
318-expect(runSecretsApply).toHaveBeenCalledWith(
319-expect.objectContaining({
320-write: false,
321-allowExec: true,
322-}),
323-);
330+expectObjectFields(mockFirstObjectArg(runSecretsApply), {
331+write: false,
332+allowExec: true,
333+});
324334});
325335});
326336@@ -331,12 +341,10 @@ describe("secrets CLI", () => {
331341await createProgram().parseAsync(["secrets", "apply", "--from", planPath, "--allow-exec"], {
332342from: "user",
333343});
334-expect(runSecretsApply).toHaveBeenCalledWith(
335-expect.objectContaining({
336-write: true,
337-allowExec: true,
338-}),
339-);
344+expectObjectFields(mockFirstObjectArg(runSecretsApply), {
345+write: true,
346+allowExec: true,
347+});
340348});
341349});
342350@@ -374,16 +382,10 @@ describe("secrets CLI", () => {
374382await createProgram().parseAsync(["secrets", "configure", "--apply", "--yes", "--allow-exec"], {
375383from: "user",
376384});
377-expect(runSecretsConfigureInteractive).toHaveBeenCalledWith(
378-expect.objectContaining({
379-allowExecInPreflight: true,
380-}),
381-);
382-expect(runSecretsApply).toHaveBeenCalledWith(
383-expect.objectContaining({
384-write: true,
385-allowExec: true,
386-}),
387-);
385+expect(mockFirstObjectArg(runSecretsConfigureInteractive).allowExecInPreflight).toBe(true);
386+expectObjectFields(mockFirstObjectArg(runSecretsApply), {
387+write: true,
388+allowExec: true,
389+});
388390});
389391});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。