test: stabilize json runtime captures (#52428) (thanks @karanuppal)

This commit is contained in:
Peter Steinberger 2026-03-22 23:48:15 +00:00
parent a2999c6cfb
commit aaa6068c08
21 changed files with 103 additions and 11 deletions

View File

@ -7,7 +7,10 @@ const runAcpClientInteractive = vi.fn(async (_opts: unknown) => {});
const serveAcpGateway = vi.fn(async (_opts: unknown) => {});
const defaultRuntime = {
log: vi.fn(),
error: vi.fn(),
writeStdout: vi.fn(),
writeJson: vi.fn(),
exit: vi.fn(),
};
@ -52,7 +55,10 @@ describe("acp cli option collisions", () => {
beforeEach(() => {
runAcpClientInteractive.mockClear();
serveAcpGateway.mockClear();
defaultRuntime.log.mockClear();
defaultRuntime.error.mockClear();
defaultRuntime.writeStdout.mockClear();
defaultRuntime.writeJson.mockClear();
defaultRuntime.exit.mockClear();
});

View File

@ -50,6 +50,12 @@ vi.mock("./browser-cli-shared.js", () => ({
const runtime = {
log: vi.fn(),
error: vi.fn(),
writeStdout: vi.fn((value: string) => {
runtime.log(value.endsWith("\n") ? value.slice(0, -1) : value);
}),
writeJson: vi.fn((value: unknown, space = 2) => {
runtime.log(JSON.stringify(value, null, space));
}),
exit: vi.fn(),
};
vi.mock("../runtime.js", () => ({

View File

@ -20,6 +20,12 @@ const mocks = vi.hoisted(() => {
runtime: {
log: runtimeLog,
error: runtimeError,
writeStdout: vi.fn((value: string) =>
runtimeLog(value.endsWith("\n") ? value.slice(0, -1) : value),
),
writeJson: vi.fn((value: unknown, space = 2) =>
runtimeLog(JSON.stringify(value, null, space)),
),
exit: runtimeExit,
},
};

View File

@ -28,6 +28,12 @@ const mocks = vi.hoisted(() => {
runtime: {
log: runtimeLog,
error: runtimeError,
writeStdout: vi.fn((value: string) =>
runtimeLog(value.endsWith("\n") ? value.slice(0, -1) : value),
),
writeJson: vi.fn((value: unknown, space = 2) =>
runtimeLog(JSON.stringify(value, null, space)),
),
exit: runtimeExit,
},
};

View File

@ -8,6 +8,12 @@ const mocks = vi.hoisted(() => ({
runtime: {
log: vi.fn(),
error: vi.fn(),
writeStdout: vi.fn((value: string) => {
mocks.runtime.log(value.endsWith("\n") ? value.slice(0, -1) : value);
}),
writeJson: vi.fn((value: unknown, space = 2) => {
mocks.runtime.log(JSON.stringify(value, null, space));
}),
exit: vi.fn(),
},
}));
@ -55,6 +61,8 @@ describe("browser state option collisions", () => {
mocks.runBrowserResizeWithOutput.mockClear();
mocks.runtime.log.mockClear();
mocks.runtime.error.mockClear();
mocks.runtime.writeStdout.mockClear();
mocks.runtime.writeJson.mockClear();
mocks.runtime.exit.mockClear();
});

View File

@ -41,6 +41,7 @@ vi.mock("../runtime.js", async (importOriginal) => {
defaultRuntime: {
log: (...args: unknown[]) => mockLog(...args),
error: (...args: unknown[]) => mockError(...args),
writeStdout: (value: string) => mockLog(value.endsWith("\n") ? value.slice(0, -1) : value),
writeJson: (value: unknown, space = 2) =>
mockLog(JSON.stringify(value, null, space > 0 ? space : undefined)),
exit: (code: number) => mockExit(code),

View File

@ -29,6 +29,7 @@ vi.mock("../runtime.js", () => ({
defaultRuntime: {
log: vi.fn(),
error: vi.fn(),
writeStdout: vi.fn(),
writeJson: vi.fn(),
exit: (code: number) => {
throw new Error(`__exit__:${code}`);

View File

@ -28,8 +28,12 @@ vi.mock("../../runtime.js", () => ({
defaultRuntime: {
log: (message: string) => runtimeLogs.push(message),
error: (message: string) => runtimeErrors.push(message),
writeJson: (value: unknown, space = 2) =>
runtimeLogs.push(JSON.stringify(value, null, space > 0 ? space : undefined)),
writeStdout: (value: string) => {
runtimeLogs.push(value.endsWith("\n") ? value.slice(0, -1) : value);
},
writeJson: (value: unknown, space = 2) => {
runtimeLogs.push(JSON.stringify(value, null, space > 0 ? space : undefined));
},
exit: (code: number) => {
throw new Error(`__exit__:${code}`);
},

View File

@ -129,6 +129,12 @@ const runtimeLogs: string[] = [];
vi.mock("../../runtime.js", () => ({
defaultRuntime: {
log: (message: string) => runtimeLogs.push(message),
writeStdout: (value: string) => {
runtimeLogs.push(value.endsWith("\n") ? value.slice(0, -1) : value);
},
writeJson: (value: unknown, space = 2) => {
runtimeLogs.push(JSON.stringify(value, null, space));
},
error: vi.fn(),
exit: vi.fn(),
},

View File

@ -8,6 +8,8 @@ export const runtimeLogs: string[] = [];
type LifecycleRuntimeHarness = OutputRuntimeEnv & {
error: MockFn<OutputRuntimeEnv["error"]>;
exit: MockFn<OutputRuntimeEnv["exit"]>;
writeStdout: MockFn<(value: string) => void>;
writeJson: MockFn<(value: unknown, space?: number) => void>;
};
type LifecycleServiceHarness = GatewayService & {
@ -24,13 +26,13 @@ export const defaultRuntime: LifecycleRuntimeHarness = {
log: (...args: unknown[]) => {
runtimeLogs.push(args.map((arg) => String(arg)).join(" "));
},
writeStdout: (value: string) => {
runtimeLogs.push(value);
},
writeJson: (value: unknown, space = 2) => {
runtimeLogs.push(JSON.stringify(value, null, space > 0 ? space : undefined));
},
error: vi.fn(),
writeStdout: vi.fn((value: string) => {
runtimeLogs.push(value.endsWith("\n") ? value.slice(0, -1) : value);
}),
writeJson: vi.fn((value: unknown, space = 2) => {
runtimeLogs.push(JSON.stringify(value, null, space > 0 ? space : undefined));
}),
exit: vi.fn((code: number) => {
throw new Error(`__exit__:${code}`);
}),

View File

@ -14,7 +14,12 @@ const withProgress = vi.fn(async (_opts: unknown, fn: () => Promise<unknown>) =>
const runtime = {
log: vi.fn(),
error: vi.fn(),
writeJson: vi.fn(),
writeStdout: vi.fn((value: string) => {
runtime.log(value.endsWith("\n") ? value.slice(0, -1) : value);
}),
writeJson: vi.fn((value: unknown, space = 2) => {
runtime.log(JSON.stringify(value, null, space > 0 ? space : undefined));
}),
exit: vi.fn(),
};

View File

@ -42,6 +42,8 @@ vi.mock("../runtime.js", () => ({
writeJson: (value: unknown, space = 2) =>
mocks.log(JSON.stringify(value, null, space > 0 ? space : undefined)),
exit: (...args: unknown[]) => mocks.exit(...args),
writeStdout: (value: string) => mocks.log(value.endsWith("\n") ? value.slice(0, -1) : value),
writeJson: (value: unknown, space = 2) => mocks.log(JSON.stringify(value, null, space)),
},
}));

View File

@ -15,6 +15,7 @@ vi.mock("../runtime.js", () => ({
defaultRuntime: {
log: (...args: unknown[]) => mockLog(...args),
error: (...args: unknown[]) => mockError(...args),
writeStdout: (value: string) => mockLog(value.endsWith("\n") ? value.slice(0, -1) : value),
writeJson: (value: unknown, space = 2) =>
mockLog(JSON.stringify(value, null, space > 0 ? space : undefined)),
exit: (code: number) => mockExit(code),

View File

@ -15,6 +15,12 @@ const createDefaultDepsMock = vi.fn(() => ({ deps: true }));
const runtime = {
log: vi.fn(),
error: vi.fn(),
writeStdout: vi.fn((value: string) => {
runtime.log(value.endsWith("\n") ? value.slice(0, -1) : value);
}),
writeJson: vi.fn((value: unknown, space = 2) => {
runtime.log(JSON.stringify(value, null, space));
}),
exit: vi.fn(),
};

View File

@ -7,6 +7,12 @@ const backupVerifyCommand = vi.fn();
const runtime = {
log: vi.fn(),
error: vi.fn(),
writeStdout: vi.fn((value: string) => {
runtime.log(value.endsWith("\n") ? value.slice(0, -1) : value);
}),
writeJson: vi.fn((value: unknown, space = 2) => {
runtime.log(JSON.stringify(value, null, space));
}),
exit: vi.fn(),
};

View File

@ -10,6 +10,12 @@ const setVerbose = vi.fn();
const runtime = {
log: vi.fn(),
error: vi.fn(),
writeStdout: vi.fn((value: string) => {
runtime.log(value.endsWith("\n") ? value.slice(0, -1) : value);
}),
writeJson: vi.fn((value: unknown, space = 2) => {
runtime.log(JSON.stringify(value, null, space));
}),
exit: vi.fn(),
};

View File

@ -6,6 +6,9 @@ const mocks = vi.hoisted(() => ({
runtime: {
log: vi.fn(),
error: vi.fn(),
writeStdout: vi.fn((value: string) => {
mocks.runtime.log(value.endsWith("\n") ? value.slice(0, -1) : value);
}),
writeJson: vi.fn((value: unknown, space = 2) => {
mocks.runtime.log(JSON.stringify(value, null, space > 0 ? space : undefined));
}),

View File

@ -23,7 +23,13 @@ vi.mock("./program/routes.js", () => ({
}));
vi.mock("../runtime.js", () => ({
defaultRuntime: { error: vi.fn(), log: vi.fn(), exit: vi.fn() },
defaultRuntime: {
error: vi.fn(),
log: vi.fn(),
writeStdout: vi.fn(),
writeJson: vi.fn(),
exit: vi.fn(),
},
}));
describe("tryRouteCli", () => {

View File

@ -22,7 +22,7 @@ export function createCliRuntimeCapture(): CliRuntimeCapture {
runtimeErrors.push(stringifyArgs(args));
},
writeStdout: (value: string) => {
runtimeLogs.push(value);
runtimeLogs.push(value.endsWith("\n") ? value.slice(0, -1) : value);
},
writeJson: (value: unknown, space = 2) => {
runtimeLogs.push(JSON.stringify(value, null, space > 0 ? space : undefined));

View File

@ -9,6 +9,12 @@ const updateWizardCommand = vi.fn(async (_opts: unknown) => {});
const defaultRuntime = {
log: vi.fn(),
error: vi.fn(),
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));
}),
exit: vi.fn(),
};
@ -41,6 +47,8 @@ describe("update cli option collisions", () => {
updateWizardCommand.mockClear();
defaultRuntime.log.mockClear();
defaultRuntime.error.mockClear();
defaultRuntime.writeStdout.mockClear();
defaultRuntime.writeJson.mockClear();
defaultRuntime.exit.mockClear();
});

View File

@ -139,6 +139,9 @@ vi.mock("../runtime.js", () => ({
defaultRuntime: {
log: runtimeLog,
error: runtimeError,
writeStdout: vi.fn((value: string) =>
runtimeLog(value.endsWith("\n") ? value.slice(0, -1) : value),
),
writeJson: runtimeWriteJson,
exit: runtimeExit,
},