const test = require("node:test"); const assert = require("node:assert/strict"); const fs = require("node:fs"); const os = require("node:os"); const path = require("node:path"); const Module = require("node:module"); const DATA_DIR_MODULE = path.resolve(__dirname, "../electron/lib/codex_data_dir.js"); const SESSIONS_MODULE = path.resolve(__dirname, "../electron/lib/sessions.js"); function loadModules(userData) { const originalLoad = Module._load; Module._load = function (request, parent, isMain) { if (request === "electron") return { app: { getPath: () => userData } }; return originalLoad.call(this, request, parent, isMain); }; delete require.cache[DATA_DIR_MODULE]; delete require.cache[SESSIONS_MODULE]; try { return { dataDir: require(DATA_DIR_MODULE), sessions: require(SESSIONS_MODULE) }; } finally { Module._load = originalLoad; } } function writeRollout(root, id, title) { const dir = path.join(root, "sessions", "2026", "08", "06"); fs.mkdirSync(dir, { recursive: true }); fs.writeFileSync(path.join(dir, "rollout-test.jsonl"), [ JSON.stringify({ type: "session_meta", payload: { session_id: id, cwd: "/work/demo", timestamp: "2026-08-06T10:00:00.000Z" } }), JSON.stringify({ type: "event_msg", payload: { type: "user_message", message: title } }), ].join("\n") + "\n"); } test("会话数据目录切换后列表读取新目录,配置可持久化", () => { const root = fs.mkdtempSync(path.join(os.tmpdir(), "codex-market-data-dir-")); const userData = path.join(root, "user-data"); const first = path.join(root, "first-codex"); const second = path.join(root, "second-codex"); fs.mkdirSync(userData, { recursive: true }); writeRollout(first, "11111111-1111-4111-8111-111111111111", "第一份记录"); writeRollout(second, "22222222-2222-4222-8222-222222222222", "第二份记录"); try { let { dataDir, sessions } = loadModules(userData); assert.throws(() => dataDir.set(path.join(root, "not-codex")), /Codex 数据/); assert.equal(dataDir.set(first).path, first); assert.equal(sessions.getCodexHome(), first); assert.deepEqual(sessions.listConversations().map((row) => row.title), ["第一份记录"]); assert.equal(dataDir.set(second).path, second); assert.equal(sessions.getCodexHome(), second); assert.deepEqual(sessions.listConversations().map((row) => row.title), ["第二份记录"]); ({ dataDir, sessions } = loadModules(userData)); assert.equal(dataDir.info().path, second); assert.deepEqual(sessions.listConversations().map((row) => row.title), ["第二份记录"]); } finally { fs.rmSync(root, { recursive: true, force: true }); } });