























11// Run-main profile env tests cover profile environment handling in the CLI entrypoint.
22import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3+import { captureEnv, deleteTestEnvValue, setTestEnvValue } from "../test-utils/env.js";
3445const fileState = vi.hoisted(() => ({
56hasCliDotEnv: false,
@@ -75,24 +76,26 @@ vi.mock("./container-target.js", async () => {
7576import { runCli } from "./run-main.js";
76777778describe("runCli profile env bootstrap", () => {
78-const originalProfile = process.env.OPENCLAW_PROFILE;
79-const originalStateDir = process.env.OPENCLAW_STATE_DIR;
80-const originalConfigPath = process.env.OPENCLAW_CONFIG_PATH;
81-const originalContainer = process.env.OPENCLAW_CONTAINER;
82-const originalGatewayPort = process.env.OPENCLAW_GATEWAY_PORT;
83-const originalGatewayUrl = process.env.OPENCLAW_GATEWAY_URL;
84-const originalGatewayToken = process.env.OPENCLAW_GATEWAY_TOKEN;
85-const originalGatewayPassword = process.env.OPENCLAW_GATEWAY_PASSWORD;
79+const envSnapshot = captureEnv([
80+"OPENCLAW_PROFILE",
81+"OPENCLAW_STATE_DIR",
82+"OPENCLAW_CONFIG_PATH",
83+"OPENCLAW_CONTAINER",
84+"OPENCLAW_GATEWAY_PORT",
85+"OPENCLAW_GATEWAY_URL",
86+"OPENCLAW_GATEWAY_TOKEN",
87+"OPENCLAW_GATEWAY_PASSWORD",
88+]);
86898790beforeEach(() => {
88-delete process.env.OPENCLAW_PROFILE;
89-delete process.env.OPENCLAW_STATE_DIR;
90-delete process.env.OPENCLAW_CONFIG_PATH;
91-delete process.env.OPENCLAW_CONTAINER;
92-delete process.env.OPENCLAW_GATEWAY_PORT;
93-delete process.env.OPENCLAW_GATEWAY_URL;
94-delete process.env.OPENCLAW_GATEWAY_TOKEN;
95-delete process.env.OPENCLAW_GATEWAY_PASSWORD;
91+deleteTestEnvValue("OPENCLAW_PROFILE");
92+deleteTestEnvValue("OPENCLAW_STATE_DIR");
93+deleteTestEnvValue("OPENCLAW_CONFIG_PATH");
94+deleteTestEnvValue("OPENCLAW_CONTAINER");
95+deleteTestEnvValue("OPENCLAW_GATEWAY_PORT");
96+deleteTestEnvValue("OPENCLAW_GATEWAY_URL");
97+deleteTestEnvValue("OPENCLAW_GATEWAY_TOKEN");
98+deleteTestEnvValue("OPENCLAW_GATEWAY_PASSWORD");
9699dotenvState.state.profileAtDotenvLoad = undefined;
97100dotenvState.state.containerAtDotenvLoad = undefined;
98101dotenvState.loadDotEnv.mockClear();
@@ -101,46 +104,7 @@ describe("runCli profile env bootstrap", () => {
101104});
102105103106afterEach(() => {
104-if (originalProfile === undefined) {
105-delete process.env.OPENCLAW_PROFILE;
106-} else {
107-process.env.OPENCLAW_PROFILE = originalProfile;
108-}
109-if (originalContainer === undefined) {
110-delete process.env.OPENCLAW_CONTAINER;
111-} else {
112-process.env.OPENCLAW_CONTAINER = originalContainer;
113-}
114-if (originalStateDir === undefined) {
115-delete process.env.OPENCLAW_STATE_DIR;
116-} else {
117-process.env.OPENCLAW_STATE_DIR = originalStateDir;
118-}
119-if (originalConfigPath === undefined) {
120-delete process.env.OPENCLAW_CONFIG_PATH;
121-} else {
122-process.env.OPENCLAW_CONFIG_PATH = originalConfigPath;
123-}
124-if (originalGatewayPort === undefined) {
125-delete process.env.OPENCLAW_GATEWAY_PORT;
126-} else {
127-process.env.OPENCLAW_GATEWAY_PORT = originalGatewayPort;
128-}
129-if (originalGatewayUrl === undefined) {
130-delete process.env.OPENCLAW_GATEWAY_URL;
131-} else {
132-process.env.OPENCLAW_GATEWAY_URL = originalGatewayUrl;
133-}
134-if (originalGatewayToken === undefined) {
135-delete process.env.OPENCLAW_GATEWAY_TOKEN;
136-} else {
137-process.env.OPENCLAW_GATEWAY_TOKEN = originalGatewayToken;
138-}
139-if (originalGatewayPassword === undefined) {
140-delete process.env.OPENCLAW_GATEWAY_PASSWORD;
141-} else {
142-process.env.OPENCLAW_GATEWAY_PASSWORD = originalGatewayPassword;
143-}
107+envSnapshot.restore();
144108});
145109146110it("applies --profile before dotenv loading", async () => {
@@ -194,7 +158,7 @@ describe("runCli profile env bootstrap", () => {
194158});
195159196160it("allows container mode when OPENCLAW_PROFILE is already set in env", async () => {
197-process.env.OPENCLAW_PROFILE = "work";
161+setTestEnvValue("OPENCLAW_PROFILE", "work");
198162199163await expect(
200164runCli(["node", "openclaw", "--container", "demo", "status"]),
@@ -207,23 +171,23 @@ describe("runCli profile env bootstrap", () => {
207171["OPENCLAW_GATEWAY_TOKEN", "demo-token"],
208172["OPENCLAW_GATEWAY_PASSWORD", "demo-password"],
209173])("allows container mode when %s is set in env", async (key, value) => {
210-process.env[key] = value;
174+setTestEnvValue(key, value);
211175212176await expect(
213177runCli(["node", "openclaw", "--container", "demo", "status"]),
214178).resolves.toBeUndefined();
215179});
216180217181it("allows container mode when only OPENCLAW_STATE_DIR is set in env", async () => {
218-process.env.OPENCLAW_STATE_DIR = "/tmp/openclaw-host-state";
182+setTestEnvValue("OPENCLAW_STATE_DIR", "/tmp/openclaw-host-state");
219183220184await expect(
221185runCli(["node", "openclaw", "--container", "demo", "status"]),
222186).resolves.toBeUndefined();
223187});
224188225189it("allows container mode when only OPENCLAW_CONFIG_PATH is set in env", async () => {
226-process.env.OPENCLAW_CONFIG_PATH = "/tmp/openclaw-host-state/openclaw.json";
190+setTestEnvValue("OPENCLAW_CONFIG_PATH", "/tmp/openclaw-host-state/openclaw.json");
227191228192await expect(
229193runCli(["node", "openclaw", "--container", "demo", "status"]),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。