test(ci): harden cli and exec tests for shared workers

This commit is contained in:
Peter Steinberger
2026-04-03 21:30:36 +01:00
parent 5361b5cf04
commit fa6e6603fa
2 changed files with 35 additions and 13 deletions

View File

@@ -104,6 +104,22 @@ async function loadCliModules() {
for (const id of unmockedDependencyIds) {
vi.doUnmock(id);
}
vi.doMock("../config/config.js", async () => {
const actual =
await vi.importActual<typeof import("../config/config.js")>("../config/config.js");
return {
...actual,
loadConfig: loadConfigMock,
readConfigFileSnapshot: readConfigFileSnapshotMock,
resolveGatewayPort: resolveGatewayPortMock,
};
});
vi.doMock("../infra/clipboard.js", () => ({
copyToClipboard: copyToClipboardMock,
}));
vi.doMock("../runtime.js", () => ({
defaultRuntime: runtime,
}));
({ dashboardCommand } = await import("../commands/dashboard.js"));
({ registerQrCli } = await import("./qr-cli.js"));
}
@@ -119,10 +135,6 @@ describe("cli integration: qr + dashboard token SecretRef", () => {
]);
});
beforeAll(async () => {
await loadCliModules();
});
afterAll(() => {
envSnapshot.restore();
vi.restoreAllMocks();
@@ -135,13 +147,14 @@ describe("cli integration: qr + dashboard token SecretRef", () => {
vi.resetModules();
});
beforeEach(() => {
beforeEach(async () => {
runtimeLogs.length = 0;
runtimeErrors.length = 0;
vi.clearAllMocks();
delete process.env.OPENCLAW_GATEWAY_TOKEN;
delete process.env.OPENCLAW_GATEWAY_PASSWORD;
delete process.env.SHARED_GATEWAY_TOKEN;
await loadCliModules();
});
it("uses the same resolved token SecretRef for qr auth validation and dashboard commands", async () => {

View File

@@ -3,25 +3,34 @@ import { EventEmitter } from "node:events";
import process from "node:process";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { OPENCLAW_CLI_ENV_VALUE } from "../infra/openclaw-exec-env.js";
import { attachChildProcessBridge } from "./child-process-bridge.js";
import {
resolveCommandEnv,
resolveProcessExitCode,
runCommandWithTimeout,
shouldSpawnWithShell,
} from "./exec.js";
let attachChildProcessBridge: typeof import("./child-process-bridge.js").attachChildProcessBridge;
let resolveCommandEnv: typeof import("./exec.js").resolveCommandEnv;
let resolveProcessExitCode: typeof import("./exec.js").resolveProcessExitCode;
let runCommandWithTimeout: typeof import("./exec.js").runCommandWithTimeout;
let shouldSpawnWithShell: typeof import("./exec.js").shouldSpawnWithShell;
async function loadExecModules() {
vi.resetModules();
vi.doUnmock("node:child_process");
({ attachChildProcessBridge } = await import("./child-process-bridge.js"));
({ resolveCommandEnv, resolveProcessExitCode, runCommandWithTimeout, shouldSpawnWithShell } =
await import("./exec.js"));
}
describe("runCommandWithTimeout", () => {
function createSilentIdleArgv(): string[] {
return [process.execPath, "-e", "setInterval(() => {}, 1_000)"];
}
beforeEach(() => {
beforeEach(async () => {
vi.useRealTimers();
await loadExecModules();
});
afterEach(() => {
vi.useRealTimers();
vi.doUnmock("node:child_process");
});
it("never enables shell execution (Windows cmd.exe injection hardening)", () => {