From 7b38e8231e1d2b0720b3bca9f18f2e24624016ea Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 2 Mar 2026 12:41:45 +0000 Subject: [PATCH] test(perf): stub expensive cli coverage integration paths --- src/cli/daemon-cli.coverage.test.ts | 16 ++++++++++++++++ src/cli/gateway-cli.coverage.test.ts | 12 ++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/cli/daemon-cli.coverage.test.ts b/src/cli/daemon-cli.coverage.test.ts index 6f320e4d031..724e1717db3 100644 --- a/src/cli/daemon-cli.coverage.test.ts +++ b/src/cli/daemon-cli.coverage.test.ts @@ -21,6 +21,16 @@ const inspectPortUsage = vi.fn(async (port: number) => ({ listeners: [], hints: [], })); +const buildGatewayInstallPlan = vi.fn( + async (params: { port: number; token?: string; env?: NodeJS.ProcessEnv }) => ({ + programArguments: ["/bin/node", "cli", "gateway", "--port", String(params.port)], + workingDirectory: process.cwd(), + environment: { + OPENCLAW_GATEWAY_PORT: String(params.port), + ...(params.token ? { OPENCLAW_GATEWAY_TOKEN: params.token } : {}), + }, + }), +); const { runtimeLogs, defaultRuntime, resetRuntimeCapture } = createCliRuntimeCapture(); @@ -65,6 +75,11 @@ vi.mock("../runtime.js", () => ({ defaultRuntime, })); +vi.mock("../commands/daemon-install-helpers.js", () => ({ + buildGatewayInstallPlan: (params: { port: number; token?: string; env?: NodeJS.ProcessEnv }) => + buildGatewayInstallPlan(params), +})); + vi.mock("./deps.js", () => ({ createDefaultDeps: () => {}, })); @@ -108,6 +123,7 @@ describe("daemon-cli coverage", () => { delete process.env.OPENCLAW_GATEWAY_PORT; delete process.env.OPENCLAW_PROFILE; serviceReadCommand.mockResolvedValue(null); + buildGatewayInstallPlan.mockClear(); }); afterEach(() => { diff --git a/src/cli/gateway-cli.coverage.test.ts b/src/cli/gateway-cli.coverage.test.ts index 64140b70c8e..4767ba6710f 100644 --- a/src/cli/gateway-cli.coverage.test.ts +++ b/src/cli/gateway-cli.coverage.test.ts @@ -1,6 +1,7 @@ import { Command } from "commander"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { withEnvOverride } from "../config/test-helpers.js"; +import { GatewayLockError } from "../infra/gateway-lock.js"; import { createCliRuntimeCapture } from "./test-runtime-capture.js"; type DiscoveredBeacon = Awaited< @@ -26,6 +27,8 @@ const discoverGatewayBeacons = vi.fn<(opts: unknown) => Promise [], ); const gatewayStatusCommand = vi.fn<(opts: unknown) => Promise>(async () => {}); +const inspectPortUsage = vi.fn(async (_port: number) => ({ status: "free" as const })); +const formatPortDiagnostics = vi.fn(() => [] as string[]); const { runtimeLogs, runtimeErrors, defaultRuntime, resetRuntimeCapture } = createCliRuntimeCapture(); @@ -85,6 +88,11 @@ vi.mock("../commands/gateway-status.js", () => ({ gatewayStatusCommand: (opts: unknown) => gatewayStatusCommand(opts), })); +vi.mock("../infra/ports.js", () => ({ + inspectPortUsage: (port: number) => inspectPortUsage(port), + formatPortDiagnostics: (diagnostics: unknown) => formatPortDiagnostics(diagnostics), +})); + const { registerGatewayCli } = await import("./gateway-cli.js"); let gatewayProgram: Command; @@ -106,6 +114,8 @@ async function expectGatewayExit(args: string[]) { describe("gateway-cli coverage", () => { beforeEach(() => { gatewayProgram = createGatewayProgram(); + inspectPortUsage.mockClear(); + formatPortDiagnostics.mockClear(); }); it("registers call/health commands and routes to callGateway", async () => { @@ -216,8 +226,6 @@ describe("gateway-cli coverage", () => { it("prints stop hints on GatewayLockError when service is loaded", async () => { resetRuntimeCapture(); serviceIsLoaded.mockResolvedValue(true); - - const { GatewayLockError } = await import("../infra/gateway-lock.js"); startGatewayServer.mockRejectedValueOnce( new GatewayLockError("another gateway instance is already listening"), );