From 140a8cf5fb4a985dcc2091af58a0cf13a1406003 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 23 Apr 2026 18:43:44 +0100 Subject: [PATCH] test: share CLI runtime mock helper --- src/cli/directory-cli.test.ts | 25 +++--------------------- src/cli/secrets-cli.test.ts | 28 ++++----------------------- src/cli/test-runtime-mock.ts | 36 +++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 46 deletions(-) create mode 100644 src/cli/test-runtime-mock.ts diff --git a/src/cli/directory-cli.test.ts b/src/cli/directory-cli.test.ts index b7b1e2bc801..35c29ff3617 100644 --- a/src/cli/directory-cli.test.ts +++ b/src/cli/directory-cli.test.ts @@ -2,28 +2,9 @@ import { Command } from "commander"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { registerDirectoryCli } from "./directory-cli.js"; -const runtimeState = vi.hoisted(() => { - const runtimeLogs: string[] = []; - const runtimeErrors: string[] = []; - const stringifyArgs = (args: unknown[]) => args.map((value) => String(value)).join(" "); - const defaultRuntime = { - log: vi.fn((...args: unknown[]) => { - runtimeLogs.push(stringifyArgs(args)); - }), - error: vi.fn((...args: unknown[]) => { - runtimeErrors.push(stringifyArgs(args)); - }), - writeStdout: vi.fn((value: string) => { - defaultRuntime.log(value.endsWith("\n") ? value.slice(0, -1) : value); - }), - writeJson: vi.fn((value: unknown, space = 2) => { - defaultRuntime.log(JSON.stringify(value, null, space > 0 ? space : undefined)); - }), - exit: vi.fn((code: number) => { - throw new Error(`exit:${code}`); - }), - }; - return { defaultRuntime, runtimeLogs, runtimeErrors }; +const runtimeState = await vi.hoisted(async () => { + const { createCliRuntimeMock } = await import("./test-runtime-mock.js"); + return createCliRuntimeMock(vi, { exitPrefix: "exit" }); }); const mocks = vi.hoisted(() => ({ diff --git a/src/cli/secrets-cli.test.ts b/src/cli/secrets-cli.test.ts index d7eb94d97a0..357b19fb03c 100644 --- a/src/cli/secrets-cli.test.ts +++ b/src/cli/secrets-cli.test.ts @@ -5,27 +5,9 @@ import { Command } from "commander"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { registerSecretsCli } from "./secrets-cli.js"; -const mocks = vi.hoisted(() => { - const runtimeLogs: string[] = []; - const runtimeErrors: string[] = []; - const stringifyArgs = (args: unknown[]) => args.map((value) => String(value)).join(" "); - const defaultRuntime = { - log: vi.fn((...args: unknown[]) => { - runtimeLogs.push(stringifyArgs(args)); - }), - error: vi.fn((...args: unknown[]) => { - runtimeErrors.push(stringifyArgs(args)); - }), - writeStdout: vi.fn((value: string) => { - defaultRuntime.log(value.endsWith("\n") ? value.slice(0, -1) : value); - }), - writeJson: vi.fn((value: unknown, space = 2) => { - defaultRuntime.log(JSON.stringify(value, null, space > 0 ? space : undefined)); - }), - exit: vi.fn((code: number) => { - throw new Error(`__exit__:${code}`); - }), - }; +const mocks = await vi.hoisted(async () => { + const { createCliRuntimeMock } = await import("./test-runtime-mock.js"); + const runtime = createCliRuntimeMock(vi); return { callGatewayFromCli: vi.fn(), runSecretsAudit: vi.fn(), @@ -33,9 +15,7 @@ const mocks = vi.hoisted(() => { runSecretsConfigureInteractive: vi.fn(), runSecretsApply: vi.fn(), confirm: vi.fn(), - defaultRuntime, - runtimeLogs, - runtimeErrors, + ...runtime, }; }); diff --git a/src/cli/test-runtime-mock.ts b/src/cli/test-runtime-mock.ts new file mode 100644 index 00000000000..855a09291ee --- /dev/null +++ b/src/cli/test-runtime-mock.ts @@ -0,0 +1,36 @@ +import type { vi } from "vitest"; + +type ViLike = Pick; + +export function createCliRuntimeMock( + viInstance: ViLike, + options: { + exitPrefix?: string; + } = {}, +) { + const runtimeLogs: string[] = []; + const runtimeErrors: string[] = []; + const stringifyArgs = (args: unknown[]) => args.map((value) => String(value)).join(" "); + const defaultRuntime = { + log: viInstance.fn((...args: unknown[]) => { + runtimeLogs.push(stringifyArgs(args)); + }), + error: viInstance.fn((...args: unknown[]) => { + runtimeErrors.push(stringifyArgs(args)); + }), + writeStdout: viInstance.fn((value: string) => { + defaultRuntime.log(value.endsWith("\n") ? value.slice(0, -1) : value); + }), + writeJson: viInstance.fn((value: unknown, space = 2) => { + defaultRuntime.log(JSON.stringify(value, null, space > 0 ? space : undefined)); + }), + exit: viInstance.fn((code: number) => { + throw new Error(`${options.exitPrefix ?? "__exit__"}:${code}`); + }), + }; + return { + defaultRuntime, + runtimeLogs, + runtimeErrors, + }; +}