diff --git a/src/agents/auth-profiles.chutes.e2e.test.ts b/src/agents/auth-profiles.chutes.e2e.test.ts index 7af0f556c1d..d57c5e1bf99 100644 --- a/src/agents/auth-profiles.chutes.e2e.test.ts +++ b/src/agents/auth-profiles.chutes.e2e.test.ts @@ -2,7 +2,7 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterEach, describe, expect, it, vi } from "vitest"; -import { captureEnv } from "../test-utils/env.js"; +import { withEnvAsync } from "../test-utils/env.js"; import { type AuthProfileStore, ensureAuthProfileStore, @@ -11,7 +11,6 @@ import { import { CHUTES_TOKEN_ENDPOINT } from "./chutes-oauth.js"; describe("auth-profiles (chutes)", () => { - let envSnapshot: ReturnType | undefined; let tempDir: string | null = null; afterEach(async () => { @@ -20,67 +19,66 @@ describe("auth-profiles (chutes)", () => { await fs.rm(tempDir, { recursive: true, force: true }); tempDir = null; } - envSnapshot?.restore(); - envSnapshot = undefined; }); it("refreshes expired Chutes OAuth credentials", async () => { - envSnapshot = captureEnv([ - "OPENCLAW_STATE_DIR", - "OPENCLAW_AGENT_DIR", - "PI_CODING_AGENT_DIR", - "CHUTES_CLIENT_ID", - ]); tempDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-chutes-")); - process.env.OPENCLAW_STATE_DIR = tempDir; - process.env.OPENCLAW_AGENT_DIR = path.join(tempDir, "agents", "main", "agent"); - process.env.PI_CODING_AGENT_DIR = process.env.OPENCLAW_AGENT_DIR; - - const authProfilePath = path.join(tempDir, "agents", "main", "agent", "auth-profiles.json"); - await fs.mkdir(path.dirname(authProfilePath), { recursive: true }); - - const store: AuthProfileStore = { - version: 1, - profiles: { - "chutes:default": { - type: "oauth", - provider: "chutes", - access: "at_old", - refresh: "rt_old", - expires: Date.now() - 60_000, - clientId: "cid_test", - }, + const agentDir = path.join(tempDir, "agents", "main", "agent"); + await withEnvAsync( + { + OPENCLAW_STATE_DIR: tempDir, + OPENCLAW_AGENT_DIR: agentDir, + PI_CODING_AGENT_DIR: agentDir, + CHUTES_CLIENT_ID: undefined, }, - }; - await fs.writeFile(authProfilePath, `${JSON.stringify(store)}\n`); + async () => { + const authProfilePath = path.join(agentDir, "auth-profiles.json"); + await fs.mkdir(path.dirname(authProfilePath), { recursive: true }); - const fetchSpy = vi.fn(async (input: string | URL) => { - const url = typeof input === "string" ? input : input.toString(); - if (url !== CHUTES_TOKEN_ENDPOINT) { - return new Response("not found", { status: 404 }); - } - return new Response( - JSON.stringify({ - access_token: "at_new", - expires_in: 3600, - }), - { status: 200, headers: { "Content-Type": "application/json" } }, - ); - }); - vi.stubGlobal("fetch", fetchSpy); + const store: AuthProfileStore = { + version: 1, + profiles: { + "chutes:default": { + type: "oauth", + provider: "chutes", + access: "at_old", + refresh: "rt_old", + expires: Date.now() - 60_000, + clientId: "cid_test", + }, + }, + }; + await fs.writeFile(authProfilePath, `${JSON.stringify(store)}\n`); - const loaded = ensureAuthProfileStore(); - const resolved = await resolveApiKeyForProfile({ - store: loaded, - profileId: "chutes:default", - }); + const fetchSpy = vi.fn(async (input: string | URL) => { + const url = typeof input === "string" ? input : input.toString(); + if (url !== CHUTES_TOKEN_ENDPOINT) { + return new Response("not found", { status: 404 }); + } + return new Response( + JSON.stringify({ + access_token: "at_new", + expires_in: 3600, + }), + { status: 200, headers: { "Content-Type": "application/json" } }, + ); + }); + vi.stubGlobal("fetch", fetchSpy); - expect(resolved?.apiKey).toBe("at_new"); - expect(fetchSpy).toHaveBeenCalled(); + const loaded = ensureAuthProfileStore(); + const resolved = await resolveApiKeyForProfile({ + store: loaded, + profileId: "chutes:default", + }); - const persisted = JSON.parse(await fs.readFile(authProfilePath, "utf8")) as { - profiles?: Record; - }; - expect(persisted.profiles?.["chutes:default"]?.access).toBe("at_new"); + expect(resolved?.apiKey).toBe("at_new"); + expect(fetchSpy).toHaveBeenCalled(); + + const persisted = JSON.parse(await fs.readFile(authProfilePath, "utf8")) as { + profiles?: Record; + }; + expect(persisted.profiles?.["chutes:default"]?.access).toBe("at_new"); + }, + ); }); }); diff --git a/src/gateway/server.models-voicewake-misc.e2e.test.ts b/src/gateway/server.models-voicewake-misc.e2e.test.ts index 2000a4b4e13..0d729ae2fca 100644 --- a/src/gateway/server.models-voicewake-misc.e2e.test.ts +++ b/src/gateway/server.models-voicewake-misc.e2e.test.ts @@ -9,7 +9,7 @@ import { resolveCanvasHostUrl } from "../infra/canvas-host-url.js"; import { GatewayLockError } from "../infra/gateway-lock.js"; import { getActivePluginRegistry, setActivePluginRegistry } from "../plugins/runtime.js"; import { createOutboundTestPlugin } from "../test-utils/channel-plugins.js"; -import { captureEnv } from "../test-utils/env.js"; +import { withEnvAsync } from "../test-utils/env.js"; import { createTempHomeEnv } from "../test-utils/temp-home.js"; import { GATEWAY_CLIENT_MODES, GATEWAY_CLIENT_NAMES } from "../utils/message-channel.js"; import { createRegistry } from "./server.e2e-registry-helpers.js"; @@ -263,25 +263,21 @@ describe("gateway server models + voicewake", () => { describe("gateway server misc", () => { test("hello-ok advertises the gateway port for canvas host", async () => { - const envSnapshot = captureEnv(["OPENCLAW_CANVAS_HOST_PORT", "OPENCLAW_GATEWAY_TOKEN"]); - try { - process.env.OPENCLAW_GATEWAY_TOKEN = "secret"; + await withEnvAsync({ OPENCLAW_GATEWAY_TOKEN: "secret" }, async () => { testTailnetIPv4.value = "100.64.0.1"; testState.gatewayBind = "lan"; const canvasPort = await getFreePort(); testState.canvasHostPort = canvasPort; - process.env.OPENCLAW_CANVAS_HOST_PORT = String(canvasPort); - - const testPort = await getFreePort(); - const canvasHostUrl = resolveCanvasHostUrl({ - canvasPort, - requestHost: `100.64.0.1:${testPort}`, - localAddress: "127.0.0.1", + await withEnvAsync({ OPENCLAW_CANVAS_HOST_PORT: String(canvasPort) }, async () => { + const testPort = await getFreePort(); + const canvasHostUrl = resolveCanvasHostUrl({ + canvasPort, + requestHost: `100.64.0.1:${testPort}`, + localAddress: "127.0.0.1", + }); + expect(canvasHostUrl).toBe(`http://100.64.0.1:${canvasPort}`); }); - expect(canvasHostUrl).toBe(`http://100.64.0.1:${canvasPort}`); - } finally { - envSnapshot.restore(); - } + }); }); test("send dedupes by idempotencyKey", { timeout: 60_000 }, async () => {