From 0227a8cc6bdc8c0fa7f07068d776d455e9ba2197 Mon Sep 17 00:00:00 2001 From: digua Date: Thu, 16 Jul 2026 17:27:14 +0800 Subject: [PATCH] fix(migration): make Electron path test cross-platform Resolve Electron userData fixtures for macOS, Windows, and Linux so the migration regression test exercises the path selected by the current runner. --- .../electron-data-migration.test.ts | 38 ++++++++++++++----- .../src/migrations/electron-data-migration.ts | 14 +++++-- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/packages/node-runtime/src/migrations/electron-data-migration.test.ts b/packages/node-runtime/src/migrations/electron-data-migration.test.ts index 0cf7e5b9..d99e5368 100644 --- a/packages/node-runtime/src/migrations/electron-data-migration.test.ts +++ b/packages/node-runtime/src/migrations/electron-data-migration.test.ts @@ -7,23 +7,20 @@ import { mock, test } from 'node:test' test('Electron migration moves persistent system data but leaves legacy temp data untouched', async (t) => { const root = fs.mkdtempSync(path.join(process.env.CHATLAB_TEST_TMPDIR ?? os.tmpdir(), 'chatlab-electron-migration-')) const originalHome = process.env.HOME - const electronUserData = path.join(root, 'Library', 'Application Support', 'ChatLab') - const electronDataDir = path.join(electronUserData, 'data') + const originalAppData = process.env.APPDATA + const appDataDir = path.join(root, 'AppData', 'Roaming') const systemDir = path.join(root, 'system') const configWrites: Array<{ section: string; key: string; value: unknown }> = [] t.after(() => { if (originalHome === undefined) delete process.env.HOME else process.env.HOME = originalHome + if (originalAppData === undefined) delete process.env.APPDATA + else process.env.APPDATA = originalAppData fs.rmSync(root, { recursive: true, force: true }) }) process.env.HOME = root - fs.mkdirSync(path.join(electronDataDir, 'databases'), { recursive: true }) - fs.mkdirSync(path.join(electronDataDir, 'ai'), { recursive: true }) - fs.mkdirSync(path.join(electronDataDir, 'temp'), { recursive: true }) - fs.writeFileSync(path.join(electronDataDir, 'databases', 'session.db'), 'sqlite') - fs.writeFileSync(path.join(electronDataDir, 'ai', 'settings.json'), '{}') - fs.writeFileSync(path.join(electronDataDir, 'temp', 'stale.tmp'), 'temporary') + process.env.APPDATA = appDataDir await mock.module('@openchatlab/config', { namedExports: { @@ -33,7 +30,30 @@ test('Electron migration moves persistent system data but leaves legacy temp dat }, }) - const { migrateFromElectronIfNeeded } = await import('./electron-data-migration.js') + const { getElectronUserDataDir, migrateFromElectronIfNeeded } = await import('./electron-data-migration.js') + assert.equal( + getElectronUserDataDir({ platform: 'darwin', homeDir: root }), + path.join(root, 'Library', 'Application Support', 'ChatLab') + ) + assert.equal( + getElectronUserDataDir({ platform: 'win32', homeDir: root, appDataDir }), + path.join(appDataDir, 'ChatLab') + ) + assert.equal(getElectronUserDataDir({ platform: 'linux', homeDir: root }), path.join(root, '.config', 'ChatLab')) + + const electronUserData = getElectronUserDataDir({ + platform: process.platform, + homeDir: root, + appDataDir, + }) + const electronDataDir = path.join(electronUserData, 'data') + fs.mkdirSync(path.join(electronDataDir, 'databases'), { recursive: true }) + fs.mkdirSync(path.join(electronDataDir, 'ai'), { recursive: true }) + fs.mkdirSync(path.join(electronDataDir, 'temp'), { recursive: true }) + fs.writeFileSync(path.join(electronDataDir, 'databases', 'session.db'), 'sqlite') + fs.writeFileSync(path.join(electronDataDir, 'ai', 'settings.json'), '{}') + fs.writeFileSync(path.join(electronDataDir, 'temp', 'stale.tmp'), 'temporary') + const result = migrateFromElectronIfNeeded(systemDir) assert.equal(result.migrated, true) diff --git a/packages/node-runtime/src/migrations/electron-data-migration.ts b/packages/node-runtime/src/migrations/electron-data-migration.ts index 7d749b31..81543a9c 100644 --- a/packages/node-runtime/src/migrations/electron-data-migration.ts +++ b/packages/node-runtime/src/migrations/electron-data-migration.ts @@ -30,13 +30,19 @@ interface StorageConfig { * - Windows: %APPDATA%/ChatLab/ * - Linux: ~/.config/ChatLab/ */ -function getElectronUserDataDir(): string { - const home = os.homedir() - switch (process.platform) { +export function getElectronUserDataDir( + options: { + platform?: NodeJS.Platform + homeDir?: string + appDataDir?: string + } = {} +): string { + const home = options.homeDir ?? os.homedir() + switch (options.platform ?? process.platform) { case 'darwin': return path.join(home, 'Library', 'Application Support', 'ChatLab') case 'win32': { - const appData = process.env.APPDATA || path.join(home, 'AppData', 'Roaming') + const appData = options.appDataDir ?? process.env.APPDATA ?? path.join(home, 'AppData', 'Roaming') return path.join(appData, 'ChatLab') } default: