import { afterEach, beforeEach, describe, expect, it } from 'bun:test'; import { skipIntegration } from '../test-utils/integration-guard'; import { getDataDir, getDbPath, getMasterKeyPath, getModuleStoragePath } from './paths'; describe('paths configuration', () => { let originalEnv: NodeJS.ProcessEnv; let _originalPlatform: string; beforeEach(() => { // Save original environment originalEnv = { ...process.env }; _originalPlatform = process.platform; }); afterEach(() => { // Restore original environment process.env = originalEnv; // Note: Cannot restore process.platform as it's read-only }); describe('getModuleStoragePath', () => { it('returns custom path when CELILO_DATA_DIR is set', () => { process.env.CELILO_DATA_DIR = '/custom/data'; delete process.env.ENVIRONMENT; const path = getModuleStoragePath(); expect(path).toBe('/custom/data/modules'); }); it('returns dev path when ENVIRONMENT=dev', () => { delete process.env.CELILO_DATA_DIR; process.env.ENVIRONMENT = 'dev'; const path = getModuleStoragePath(); expect(path).toMatch(/celilo-data\/modules$/); }); it.skipIf(skipIntegration({ platform: 'darwin' }))( 'returns platform-specific path by default', () => { delete process.env.CELILO_DATA_DIR; delete process.env.ENVIRONMENT; const path = getModuleStoragePath(); if (process.platform === 'darwin') { expect(path).toMatch(/Library\/Application Support\/celilo\/modules$/); } else { expect(path).toBe('/var/lib/celilo/modules'); } }, ); it('prioritizes CELILO_DATA_DIR over ENVIRONMENT=dev', () => { process.env.CELILO_DATA_DIR = '/custom/data'; process.env.ENVIRONMENT = 'dev'; const path = getModuleStoragePath(); expect(path).toBe('/custom/data/modules'); }); }); describe('getDataDir', () => { it('returns custom path when CELILO_DATA_DIR is set', () => { process.env.CELILO_DATA_DIR = '/custom/data'; delete process.env.ENVIRONMENT; const path = getDataDir(); expect(path).toBe('/custom/data'); }); it('returns dev path when ENVIRONMENT=dev', () => { delete process.env.CELILO_DATA_DIR; process.env.ENVIRONMENT = 'dev'; const path = getDataDir(); expect(path).toMatch(/celilo-data$/); }); it.skipIf(skipIntegration({ platform: 'darwin' }))( 'returns platform-specific path by default', () => { delete process.env.CELILO_DATA_DIR; delete process.env.ENVIRONMENT; const path = getDataDir(); if (process.platform === 'darwin') { expect(path).toMatch(/Library\/Application Support\/celilo$/); } else { expect(path).toBe('/var/lib/celilo'); } }, ); }); describe('getMasterKeyPath', () => { it('returns custom path when CELILO_MASTER_KEY_PATH is set', () => { process.env.CELILO_MASTER_KEY_PATH = '/custom/master.key'; const path = getMasterKeyPath(); expect(path).toBe('/custom/master.key'); }); it('returns data dir + master.key when CELILO_MASTER_KEY_PATH not set', () => { delete process.env.CELILO_MASTER_KEY_PATH; process.env.CELILO_DATA_DIR = '/custom/data'; const path = getMasterKeyPath(); expect(path).toBe('/custom/data/master.key'); }); it.skipIf(skipIntegration({ platform: 'darwin' }))( 'uses platform-specific data dir by default', () => { delete process.env.CELILO_MASTER_KEY_PATH; delete process.env.CELILO_DATA_DIR; delete process.env.ENVIRONMENT; const path = getMasterKeyPath(); if (process.platform === 'darwin') { expect(path).toMatch(/Library\/Application Support\/celilo\/master\.key$/); } else { expect(path).toBe('/var/lib/celilo/master.key'); } }, ); }); describe('getDbPath', () => { it('returns custom path when CELILO_DB_PATH is set', () => { process.env.CELILO_DB_PATH = '/custom/path/celilo.db'; delete process.env.CELILO_DATA_DIR; delete process.env.ENVIRONMENT; const path = getDbPath(); expect(path).toBe('/custom/path/celilo.db'); }); it.skipIf(skipIntegration({ platform: 'darwin' }))( 'returns data dir + celilo.db on macOS in production', () => { delete process.env.CELILO_DB_PATH; delete process.env.CELILO_DATA_DIR; delete process.env.ENVIRONMENT; const path = getDbPath(); if (process.platform === 'darwin') { expect(path).toMatch(/Library\/Application Support\/celilo\/celilo.db$/); } else { expect(path).toBe('/var/lib/celilo/celilo.db'); } }, ); it('returns celilo-data/celilo.db in development mode', () => { delete process.env.CELILO_DB_PATH; delete process.env.CELILO_DATA_DIR; process.env.ENVIRONMENT = 'dev'; const path = getDbPath(); expect(path).toMatch(/celilo-data\/celilo.db$/); }); it('respects CELILO_DATA_DIR override', () => { delete process.env.CELILO_DB_PATH; process.env.CELILO_DATA_DIR = '/custom/data'; delete process.env.ENVIRONMENT; const path = getDbPath(); expect(path).toBe('/custom/data/celilo.db'); }); it('prioritizes CELILO_DB_PATH over CELILO_DATA_DIR', () => { process.env.CELILO_DB_PATH = '/explicit/db.db'; process.env.CELILO_DATA_DIR = '/custom/data'; delete process.env.ENVIRONMENT; const path = getDbPath(); expect(path).toBe('/explicit/db.db'); }); }); });