test(gateway): cover live helper env isolation

This commit is contained in:
Peter Steinberger
2026-04-07 08:25:41 +01:00
parent 8a6bb1b80e
commit 494c25b0c4
2 changed files with 101 additions and 2 deletions

View File

@@ -0,0 +1,95 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../utils/message-channel.js";
const gatewayClientState = vi.hoisted(() => ({
lastOptions: undefined as Record<string, unknown> | undefined,
}));
vi.mock("./client.js", () => ({
GatewayClient: class MockGatewayClient {
constructor(options: Record<string, unknown>) {
gatewayClientState.lastOptions = options;
}
start() {
const options = gatewayClientState.lastOptions as
| { onHelloOk?: (hello: { type: "hello-ok" }) => void }
| undefined;
queueMicrotask(() => options?.onHelloOk?.({ type: "hello-ok" }));
}
async stopAndWait() {}
},
}));
describe("gateway cli backend live helpers", () => {
afterEach(() => {
gatewayClientState.lastOptions = undefined;
delete process.env.OPENCLAW_SKIP_CHANNELS;
delete process.env.OPENCLAW_SKIP_GMAIL_WATCHER;
delete process.env.OPENCLAW_SKIP_CRON;
delete process.env.OPENCLAW_SKIP_CANVAS_HOST;
delete process.env.OPENCLAW_SKIP_BROWSER_CONTROL_SERVER;
delete process.env.OPENCLAW_TEST_MINIMAL_GATEWAY;
delete process.env.ANTHROPIC_API_KEY;
delete process.env.ANTHROPIC_API_KEY_OLD;
});
it("applies and restores live env including minimal gateway mode", async () => {
const { applyCliBackendLiveEnv, restoreCliBackendLiveEnv, snapshotCliBackendLiveEnv } =
await import("./gateway-cli-backend.live-helpers.js");
process.env.OPENCLAW_SKIP_CHANNELS = "old-channels";
process.env.OPENCLAW_SKIP_GMAIL_WATCHER = "old-gmail";
process.env.OPENCLAW_SKIP_CRON = "old-cron";
process.env.OPENCLAW_SKIP_CANVAS_HOST = "old-canvas";
process.env.OPENCLAW_SKIP_BROWSER_CONTROL_SERVER = "old-browser";
process.env.OPENCLAW_TEST_MINIMAL_GATEWAY = "old-minimal";
process.env.ANTHROPIC_API_KEY = "old-anthropic";
process.env.ANTHROPIC_API_KEY_OLD = "old-anthropic-old";
const snapshot = snapshotCliBackendLiveEnv();
applyCliBackendLiveEnv(new Set<string>());
expect(process.env.OPENCLAW_SKIP_CHANNELS).toBe("1");
expect(process.env.OPENCLAW_SKIP_GMAIL_WATCHER).toBe("1");
expect(process.env.OPENCLAW_SKIP_CRON).toBe("1");
expect(process.env.OPENCLAW_SKIP_CANVAS_HOST).toBe("1");
expect(process.env.OPENCLAW_SKIP_BROWSER_CONTROL_SERVER).toBe("1");
expect(process.env.OPENCLAW_TEST_MINIMAL_GATEWAY).toBe("1");
expect(process.env.ANTHROPIC_API_KEY).toBeUndefined();
expect(process.env.ANTHROPIC_API_KEY_OLD).toBeUndefined();
restoreCliBackendLiveEnv(snapshot);
expect(process.env.OPENCLAW_SKIP_CHANNELS).toBe("old-channels");
expect(process.env.OPENCLAW_SKIP_GMAIL_WATCHER).toBe("old-gmail");
expect(process.env.OPENCLAW_SKIP_CRON).toBe("old-cron");
expect(process.env.OPENCLAW_SKIP_CANVAS_HOST).toBe("old-canvas");
expect(process.env.OPENCLAW_SKIP_BROWSER_CONTROL_SERVER).toBe("old-browser");
expect(process.env.OPENCLAW_TEST_MINIMAL_GATEWAY).toBe("old-minimal");
expect(process.env.ANTHROPIC_API_KEY).toBe("old-anthropic");
expect(process.env.ANTHROPIC_API_KEY_OLD).toBe("old-anthropic-old");
});
it("builds the live gateway client with test identity defaults", async () => {
const { connectTestGatewayClient } = await import("./gateway-cli-backend.live-helpers.js");
const client = await connectTestGatewayClient({
url: "ws://127.0.0.1:18789",
token: "gateway-token",
});
expect(client).toBeTruthy();
expect(gatewayClientState.lastOptions).toMatchObject({
url: "ws://127.0.0.1:18789",
token: "gateway-token",
clientName: GATEWAY_CLIENT_NAMES.TEST,
clientDisplayName: "vitest-live",
clientVersion: "dev",
mode: GATEWAY_CLIENT_MODES.TEST,
connectChallengeTimeoutMs: 30_000,
});
expect(gatewayClientState.lastOptions).not.toHaveProperty("requestTimeoutMs");
});
});

View File

@@ -100,6 +100,7 @@ export type CliBackendLiveEnvSnapshot = {
skipCron?: string;
skipCanvas?: string;
skipBrowserControl?: string;
minimalGateway?: string;
anthropicApiKey?: string;
anthropicApiKeyOld?: string;
};
@@ -301,9 +302,9 @@ async function connectClientOnce(params: {
url: params.url,
token: params.token,
clientName: GATEWAY_CLIENT_NAMES.TEST,
clientDisplayName: "vitest-live",
clientVersion: "dev",
mode: "test",
requestTimeoutMs: params.timeoutMs,
mode: GATEWAY_CLIENT_MODES.TEST,
connectChallengeTimeoutMs: params.timeoutMs,
deviceIdentity: params.deviceIdentity,
onHelloOk: () => finish({ client }),
@@ -341,6 +342,7 @@ export function snapshotCliBackendLiveEnv(): CliBackendLiveEnvSnapshot {
skipCron: process.env.OPENCLAW_SKIP_CRON,
skipCanvas: process.env.OPENCLAW_SKIP_CANVAS_HOST,
skipBrowserControl: process.env.OPENCLAW_SKIP_BROWSER_CONTROL_SERVER,
minimalGateway: process.env.OPENCLAW_TEST_MINIMAL_GATEWAY,
anthropicApiKey: process.env.ANTHROPIC_API_KEY,
anthropicApiKeyOld: process.env.ANTHROPIC_API_KEY_OLD,
};
@@ -352,6 +354,7 @@ export function applyCliBackendLiveEnv(preservedEnv: ReadonlySet<string>): void
process.env.OPENCLAW_SKIP_CRON = "1";
process.env.OPENCLAW_SKIP_CANVAS_HOST = "1";
process.env.OPENCLAW_SKIP_BROWSER_CONTROL_SERVER = "1";
process.env.OPENCLAW_TEST_MINIMAL_GATEWAY = "1";
if (!preservedEnv.has("ANTHROPIC_API_KEY")) {
delete process.env.ANTHROPIC_API_KEY;
}
@@ -369,6 +372,7 @@ export function restoreCliBackendLiveEnv(snapshot: CliBackendLiveEnvSnapshot): v
restoreEnvVar("OPENCLAW_SKIP_CRON", snapshot.skipCron);
restoreEnvVar("OPENCLAW_SKIP_CANVAS_HOST", snapshot.skipCanvas);
restoreEnvVar("OPENCLAW_SKIP_BROWSER_CONTROL_SERVER", snapshot.skipBrowserControl);
restoreEnvVar("OPENCLAW_TEST_MINIMAL_GATEWAY", snapshot.minimalGateway);
restoreEnvVar("ANTHROPIC_API_KEY", snapshot.anthropicApiKey);
restoreEnvVar("ANTHROPIC_API_KEY_OLD", snapshot.anthropicApiKeyOld);
}