test: speed up cli and command suites

This commit is contained in:
Peter Steinberger
2026-03-31 02:12:23 +01:00
parent 6b6ddcd2a6
commit 3f1d6fe147
83 changed files with 1161 additions and 1054 deletions

View File

@@ -1,7 +1,7 @@
import { Command } from "commander";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { captureEnv } from "../test-utils/env.js";
import { createCliRuntimeCapture } from "./test-runtime-capture.js";
import { registerDaemonCli } from "./daemon-cli.js";
const probeGatewayStatus = vi.fn(async (..._args: unknown[]) => ({ ok: true }));
const resolveGatewayProgramArguments = vi.fn(async (_opts?: unknown) => ({
@@ -34,7 +34,28 @@ const buildGatewayInstallPlan = vi.fn(
}),
);
const { runtimeLogs, defaultRuntime, resetRuntimeCapture } = createCliRuntimeCapture();
const mocks = vi.hoisted(() => {
const runtimeLogs: 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(),
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 { runtimeLogs, defaultRuntime };
});
const { runtimeLogs } = mocks;
vi.mock("./daemon-cli/probe.js", () => ({
probeGatewayStatus: (opts: unknown) => probeGatewayStatus(opts),
@@ -85,7 +106,7 @@ vi.mock("../infra/ports.js", () => ({
vi.mock("../runtime.js", async (importOriginal) => ({
...(await importOriginal<typeof import("../runtime.js")>()),
defaultRuntime,
defaultRuntime: mocks.defaultRuntime,
}));
vi.mock("../commands/daemon-install-helpers.js", () => ({
@@ -101,7 +122,6 @@ vi.mock("./progress.js", () => ({
withProgress: async (_opts: unknown, fn: () => Promise<unknown>) => await fn(),
}));
const { registerDaemonCli } = await import("./daemon-cli.js");
let daemonProgram: Command;
function createDaemonProgram() {
@@ -145,7 +165,7 @@ describe("daemon-cli coverage", () => {
});
it("probes gateway status by default", async () => {
resetRuntimeCapture();
runtimeLogs.length = 0;
probeGatewayStatus.mockClear();
await runDaemonCommand(["daemon", "status"]);
@@ -159,7 +179,7 @@ describe("daemon-cli coverage", () => {
});
it("derives probe URL from service args + env (json)", async () => {
resetRuntimeCapture();
runtimeLogs.length = 0;
probeGatewayStatus.mockClear();
inspectPortUsage.mockClear();
@@ -208,7 +228,7 @@ describe("daemon-cli coverage", () => {
});
it("installs the daemon (json output)", async () => {
resetRuntimeCapture();
runtimeLogs.length = 0;
serviceIsLoaded.mockResolvedValueOnce(false);
serviceInstall.mockClear();
@@ -234,7 +254,7 @@ describe("daemon-cli coverage", () => {
});
it("starts and stops daemon (json output)", async () => {
resetRuntimeCapture();
runtimeLogs.length = 0;
serviceRestart.mockClear();
serviceStop.mockClear();
serviceIsLoaded.mockResolvedValue(true);