



























@@ -10,6 +10,7 @@ import {
1010resolveSessionTranscriptsDirForAgent,
1111} from "../config/sessions/paths.js";
1212import type { SessionEntry } from "../config/sessions/types.js";
13+import { captureEnv, deleteTestEnvValue, setTestEnvValue } from "../test-utils/env.js";
1314import {
1415clearTuiLastSessionPointers,
1516moveHeartbeatMainSessionEntry,
@@ -29,35 +30,6 @@ vi.mock("../channels/plugins/persisted-auth-state.js", () => ({
29303031const noteMock = vi.fn();
313232-type EnvSnapshot = {
33-HOME?: string;
34-OPENCLAW_HOME?: string;
35-OPENCLAW_STATE_DIR?: string;
36-OPENCLAW_OAUTH_DIR?: string;
37-OPENCLAW_AGENT_DIR?: string;
38-};
39-40-function captureEnv(): EnvSnapshot {
41-return {
42-HOME: process.env.HOME,
43-OPENCLAW_HOME: process.env.OPENCLAW_HOME,
44-OPENCLAW_STATE_DIR: process.env.OPENCLAW_STATE_DIR,
45-OPENCLAW_OAUTH_DIR: process.env.OPENCLAW_OAUTH_DIR,
46-OPENCLAW_AGENT_DIR: process.env.OPENCLAW_AGENT_DIR,
47-};
48-}
49-50-function restoreEnv(snapshot: EnvSnapshot) {
51-for (const key of Object.keys(snapshot) as Array<keyof EnvSnapshot>) {
52-const value = snapshot[key];
53-if (value === undefined) {
54-delete process.env[key];
55-} else {
56-process.env[key] = value;
57-}
58-}
59-}
60-6133function setupSessionState(cfg: OpenClawConfig, env: NodeJS.ProcessEnv, homeDir: string) {
6234const agentId = "main";
6335const sessionsDir = resolveSessionTranscriptsDirForAgent(agentId, env, () => homeDir);
@@ -149,23 +121,30 @@ async function runOrphanTranscriptCheckWithQmdSessions(enabled: boolean, homeDir
149121}
150122151123describe("doctor state integrity oauth dir checks", () => {
152-let envSnapshot: EnvSnapshot;
124+let envSnapshot: ReturnType<typeof captureEnv>;
153125let tempHome = "";
154126155127beforeEach(() => {
156-envSnapshot = captureEnv();
128+envSnapshot = captureEnv([
129+"HOME",
130+"OPENCLAW_HOME",
131+"OPENCLAW_STATE_DIR",
132+"OPENCLAW_OAUTH_DIR",
133+"OPENCLAW_AGENT_DIR",
134+]);
157135tempHome = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-doctor-state-integrity-"));
158-process.env.HOME = tempHome;
159-process.env.OPENCLAW_HOME = tempHome;
160-process.env.OPENCLAW_STATE_DIR = path.join(tempHome, ".openclaw");
161-delete process.env.OPENCLAW_OAUTH_DIR;
162-delete process.env.OPENCLAW_AGENT_DIR;
163-fs.mkdirSync(process.env.OPENCLAW_STATE_DIR, { recursive: true, mode: 0o700 });
136+const stateDir = path.join(tempHome, ".openclaw");
137+setTestEnvValue("HOME", tempHome);
138+setTestEnvValue("OPENCLAW_HOME", tempHome);
139+setTestEnvValue("OPENCLAW_STATE_DIR", stateDir);
140+deleteTestEnvValue("OPENCLAW_OAUTH_DIR");
141+deleteTestEnvValue("OPENCLAW_AGENT_DIR");
142+fs.mkdirSync(stateDir, { recursive: true, mode: 0o700 });
164143noteMock.mockClear();
165144});
166145167146afterEach(() => {
168-restoreEnv(envSnapshot);
147+envSnapshot.restore();
169148fs.rmSync(tempHome, { recursive: true, force: true });
170149});
171150@@ -274,7 +253,7 @@ describe("doctor state integrity oauth dir checks", () => {
274253"legacy",
275254"agent",
276255);
277-process.env.OPENCLAW_AGENT_DIR = legacyAgentDir;
256+setTestEnvValue("OPENCLAW_AGENT_DIR", legacyAgentDir);
278257279258const text = await runStateIntegrityText({
280259agents: {
@@ -467,9 +446,10 @@ describe("doctor state integrity oauth dir checks", () => {
467446);
468447fs.symlinkSync(originalHome, symlinkHome, "dir");
469448try {
470-process.env.HOME = symlinkHome;
471-process.env.OPENCLAW_HOME = symlinkHome;
472-process.env.OPENCLAW_STATE_DIR = path.join(symlinkHome, ".openclaw");
449+const symlinkStateDir = path.join(symlinkHome, ".openclaw");
450+setTestEnvValue("HOME", symlinkHome);
451+setTestEnvValue("OPENCLAW_HOME", symlinkHome);
452+setTestEnvValue("OPENCLAW_STATE_DIR", symlinkStateDir);
473453474454setupSessionState(cfg, process.env, symlinkHome);
475455const sessionsDir = resolveSessionTranscriptsDirForAgent(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。