import os from 'node:os' import path from 'node:path' import { beforeEach, describe, expect, it, vi } from 'vitest' async function loadConfigWithEnv(env: Record) { vi.resetModules() const original = { MISSION_CONTROL_DATA_DIR: process.env.MISSION_CONTROL_DATA_DIR, MISSION_CONTROL_BUILD_DATA_DIR: process.env.MISSION_CONTROL_BUILD_DATA_DIR, MISSION_CONTROL_BUILD_DB_PATH: process.env.MISSION_CONTROL_BUILD_DB_PATH, MISSION_CONTROL_BUILD_TOKENS_PATH: process.env.MISSION_CONTROL_BUILD_TOKENS_PATH, MISSION_CONTROL_DB_PATH: process.env.MISSION_CONTROL_DB_PATH, MISSION_CONTROL_TOKENS_PATH: process.env.MISSION_CONTROL_TOKENS_PATH, NEXT_PHASE: process.env.NEXT_PHASE, } for (const [key, value] of Object.entries(env)) { if (value === undefined) { delete process.env[key] } else { process.env[key] = value } } const mod = await import('./config') if (original.MISSION_CONTROL_DATA_DIR === undefined) delete process.env.MISSION_CONTROL_DATA_DIR else process.env.MISSION_CONTROL_DATA_DIR = original.MISSION_CONTROL_DATA_DIR if (original.MISSION_CONTROL_BUILD_DATA_DIR === undefined) delete process.env.MISSION_CONTROL_BUILD_DATA_DIR else process.env.MISSION_CONTROL_BUILD_DATA_DIR = original.MISSION_CONTROL_BUILD_DATA_DIR if (original.MISSION_CONTROL_BUILD_DB_PATH === undefined) delete process.env.MISSION_CONTROL_BUILD_DB_PATH else process.env.MISSION_CONTROL_BUILD_DB_PATH = original.MISSION_CONTROL_BUILD_DB_PATH if (original.MISSION_CONTROL_BUILD_TOKENS_PATH === undefined) delete process.env.MISSION_CONTROL_BUILD_TOKENS_PATH else process.env.MISSION_CONTROL_BUILD_TOKENS_PATH = original.MISSION_CONTROL_BUILD_TOKENS_PATH if (original.MISSION_CONTROL_DB_PATH === undefined) delete process.env.MISSION_CONTROL_DB_PATH else process.env.MISSION_CONTROL_DB_PATH = original.MISSION_CONTROL_DB_PATH if (original.MISSION_CONTROL_TOKENS_PATH === undefined) delete process.env.MISSION_CONTROL_TOKENS_PATH else process.env.MISSION_CONTROL_TOKENS_PATH = original.MISSION_CONTROL_TOKENS_PATH if (original.NEXT_PHASE === undefined) delete process.env.NEXT_PHASE else process.env.NEXT_PHASE = original.NEXT_PHASE return mod.config } describe('config data paths', () => { beforeEach(() => { vi.resetModules() }) it('derives db and token paths from MISSION_CONTROL_DATA_DIR', async () => { const config = await loadConfigWithEnv({ MISSION_CONTROL_DATA_DIR: '/tmp/mission-control-data', MISSION_CONTROL_DB_PATH: undefined, MISSION_CONTROL_TOKENS_PATH: undefined, }) expect(config.dataDir).toBe('/tmp/mission-control-data') expect(config.dbPath).toBe('/tmp/mission-control-data/mission-control.db') expect(config.tokensPath).toBe('/tmp/mission-control-data/mission-control-tokens.json') }) it('respects explicit db and token path overrides', async () => { const config = await loadConfigWithEnv({ MISSION_CONTROL_DATA_DIR: '/tmp/mission-control-data', MISSION_CONTROL_DB_PATH: '/tmp/custom.db', MISSION_CONTROL_TOKENS_PATH: '/tmp/custom-tokens.json', }) expect(config.dataDir).toBe('/tmp/mission-control-data') expect(config.dbPath).toBe('/tmp/custom.db') expect(config.tokensPath).toBe('/tmp/custom-tokens.json') }) it('uses a build-scoped worker data dir during next build', async () => { const config = await loadConfigWithEnv({ NEXT_PHASE: 'phase-production-build', MISSION_CONTROL_DATA_DIR: '/tmp/runtime-data', MISSION_CONTROL_BUILD_DATA_DIR: '/tmp/build-scratch', MISSION_CONTROL_DB_PATH: undefined, MISSION_CONTROL_TOKENS_PATH: undefined, }) expect(config.dataDir).toMatch(/^\/tmp\/build-scratch\/worker-\d+$/) expect(config.dbPath).toMatch(/^\/tmp\/build-scratch\/worker-\d+\/mission-control\.db$/) expect(config.tokensPath).toMatch(/^\/tmp\/build-scratch\/worker-\d+\/mission-control-tokens\.json$/) }) it('prefers build-specific db and token overrides during next build', async () => { const config = await loadConfigWithEnv({ NEXT_PHASE: 'phase-production-build', MISSION_CONTROL_DATA_DIR: '/tmp/runtime-data', MISSION_CONTROL_DB_PATH: '/tmp/runtime.db', MISSION_CONTROL_TOKENS_PATH: '/tmp/runtime-tokens.json', MISSION_CONTROL_BUILD_DB_PATH: '/tmp/build.db', MISSION_CONTROL_BUILD_TOKENS_PATH: '/tmp/build-tokens.json', }) const expectedBuildRoot = path.join(os.tmpdir(), 'mission-control-build') expect(config.dataDir).toMatch(new RegExp(`^${expectedBuildRoot.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}/worker-\\d+$`)) expect(config.dbPath).toBe('/tmp/build.db') expect(config.tokensPath).toBe('/tmp/build-tokens.json') }) })