From 31980bcaf1b8a4b4c49267b712fcd4df911a6bd7 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 23:18:16 +0000 Subject: [PATCH] refactor(test): dedupe gateway env restores --- src/gateway/server.sessions-send.e2e.test.ts | 18 ++++-------------- src/gateway/server.skills-status.e2e.test.ts | 17 +++++------------ src/gateway/server.talk-config.e2e.test.ts | 8 ++------ src/gateway/test-helpers.server.ts | 4 +++- 4 files changed, 14 insertions(+), 33 deletions(-) diff --git a/src/gateway/server.sessions-send.e2e.test.ts b/src/gateway/server.sessions-send.e2e.test.ts index 58f7d65b1..af3b14361 100644 --- a/src/gateway/server.sessions-send.e2e.test.ts +++ b/src/gateway/server.sessions-send.e2e.test.ts @@ -4,6 +4,7 @@ import { afterAll, beforeAll, describe, expect, it, vi } from "vitest"; import { createOpenClawTools } from "../agents/openclaw-tools.js"; import { resolveSessionTranscriptPath } from "../config/sessions.js"; import { emitAgentEvent } from "../infra/agent-events.js"; +import { captureEnv } from "../test-utils/env.js"; import { agentCommand, getFreePort, @@ -16,13 +17,11 @@ installGatewayTestHooks({ scope: "suite" }); let server: Awaited>; let gatewayPort: number; -let prevGatewayPort: string | undefined; -let prevGatewayToken: string | undefined; const gatewayToken = "test-token"; +let envSnapshot: ReturnType; beforeAll(async () => { - prevGatewayPort = process.env.OPENCLAW_GATEWAY_PORT; - prevGatewayToken = process.env.OPENCLAW_GATEWAY_TOKEN; + envSnapshot = captureEnv(["OPENCLAW_GATEWAY_PORT", "OPENCLAW_GATEWAY_TOKEN"]); gatewayPort = await getFreePort(); testState.gatewayAuth = { mode: "token", token: gatewayToken }; process.env.OPENCLAW_GATEWAY_PORT = String(gatewayPort); @@ -32,16 +31,7 @@ beforeAll(async () => { afterAll(async () => { await server.close(); - if (prevGatewayPort === undefined) { - delete process.env.OPENCLAW_GATEWAY_PORT; - } else { - process.env.OPENCLAW_GATEWAY_PORT = prevGatewayPort; - } - if (prevGatewayToken === undefined) { - delete process.env.OPENCLAW_GATEWAY_TOKEN; - } else { - process.env.OPENCLAW_GATEWAY_TOKEN = prevGatewayToken; - } + envSnapshot.restore(); }); describe("sessions_send gateway loopback", () => { diff --git a/src/gateway/server.skills-status.e2e.test.ts b/src/gateway/server.skills-status.e2e.test.ts index c7446e046..f4ff52faa 100644 --- a/src/gateway/server.skills-status.e2e.test.ts +++ b/src/gateway/server.skills-status.e2e.test.ts @@ -1,5 +1,6 @@ import path from "node:path"; import { describe, expect, it } from "vitest"; +import { captureEnv } from "../test-utils/env.js"; import { connectOk, installGatewayTestHooks, @@ -12,23 +13,19 @@ installGatewayTestHooks({ scope: "suite" }); async function withServer( run: (ws: Awaited>["ws"]) => Promise, ) { - const { server, ws, prevToken } = await startServerWithClient("secret"); + const { server, ws, envSnapshot } = await startServerWithClient("secret"); try { return await run(ws); } finally { ws.close(); await server.close(); - if (prevToken === undefined) { - delete process.env.OPENCLAW_GATEWAY_TOKEN; - } else { - process.env.OPENCLAW_GATEWAY_TOKEN = prevToken; - } + envSnapshot.restore(); } } describe("gateway skills.status", () => { it("does not expose raw config values to operator.read clients", async () => { - const prevBundledSkillsDir = process.env.OPENCLAW_BUNDLED_SKILLS_DIR; + const envSnapshot = captureEnv(["OPENCLAW_BUNDLED_SKILLS_DIR"]); process.env.OPENCLAW_BUNDLED_SKILLS_DIR = path.join(process.cwd(), "skills"); const secret = "discord-token-secret-abc"; const { writeConfigFile } = await import("../config/config.js"); @@ -62,11 +59,7 @@ describe("gateway skills.status", () => { expect(check && "value" in check).toBe(false); }); } finally { - if (prevBundledSkillsDir === undefined) { - delete process.env.OPENCLAW_BUNDLED_SKILLS_DIR; - } else { - process.env.OPENCLAW_BUNDLED_SKILLS_DIR = prevBundledSkillsDir; - } + envSnapshot.restore(); } }); }); diff --git a/src/gateway/server.talk-config.e2e.test.ts b/src/gateway/server.talk-config.e2e.test.ts index 4cbea6474..e6023d9e5 100644 --- a/src/gateway/server.talk-config.e2e.test.ts +++ b/src/gateway/server.talk-config.e2e.test.ts @@ -11,17 +11,13 @@ installGatewayTestHooks({ scope: "suite" }); async function withServer( run: (ws: Awaited>["ws"]) => Promise, ) { - const { server, ws, prevToken } = await startServerWithClient("secret"); + const { server, ws, envSnapshot } = await startServerWithClient("secret"); try { return await run(ws); } finally { ws.close(); await server.close(); - if (prevToken === undefined) { - delete process.env.OPENCLAW_GATEWAY_TOKEN; - } else { - process.env.OPENCLAW_GATEWAY_TOKEN = prevToken; - } + envSnapshot.restore(); } } diff --git a/src/gateway/test-helpers.server.ts b/src/gateway/test-helpers.server.ts index 64c7ffd33..509c30773 100644 --- a/src/gateway/test-helpers.server.ts +++ b/src/gateway/test-helpers.server.ts @@ -16,6 +16,7 @@ import { drainSystemEvents, peekSystemEvents } from "../infra/system-events.js"; import { rawDataToString } from "../infra/ws.js"; import { resetLogger, setLoggerOverride } from "../logging.js"; import { DEFAULT_AGENT_ID, toAgentStoreSessionKey } from "../routing/session-key.js"; +import { captureEnv } from "../test-utils/env.js"; import { getDeterministicFreePortBlock } from "../test-utils/ports.js"; import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../utils/message-channel.js"; import { buildDeviceAuthPayload } from "./device-auth.js"; @@ -374,6 +375,7 @@ export async function startServerWithClient( ) { const { wsHeaders, ...gatewayOpts } = opts ?? {}; let port = await getFreePort(); + const envSnapshot = captureEnv(["OPENCLAW_GATEWAY_TOKEN"]); const prev = process.env.OPENCLAW_GATEWAY_TOKEN; if (typeof token === "string") { testState.gatewayAuth = { mode: "token", token }; @@ -421,7 +423,7 @@ export async function startServerWithClient( ws.once("error", onError); ws.once("close", onClose); }); - return { server, ws, port, prevToken: prev }; + return { server, ws, port, prevToken: prev, envSnapshot }; } type ConnectResponse = {