import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { loadConfig } from '../src/config.js'; const REQUIRED_VARS = ['STORAGE_DIR', 'DB_HOST', 'DB_USER', 'DB_PASSWORD', 'DB_NAME']; let savedEnv; beforeEach(() => { savedEnv = { ...process.env }; }); afterEach(() => { process.env = savedEnv; }); describe('loadConfig', () => { it('returns parsed config when all required vars are set', () => { process.env.STORAGE_DIR = './storage'; process.env.DB_HOST = 'localhost'; process.env.DB_USER = 'user'; process.env.DB_PASSWORD = 'pass'; process.env.DB_NAME = 'db'; process.env.PORT = '4000'; process.env.MAX_FILE_SIZE_MB = '50'; const config = loadConfig(); expect(config.port).toBe(4000); expect(config.storageDir).toBe('./storage'); expect(config.db).toEqual({ host: 'localhost', user: 'user', password: 'pass', database: 'db' }); expect(config.maxFileSizeMb).toBe(50); }); it('applies defaults for optional vars', () => { process.env.STORAGE_DIR = './storage'; process.env.DB_HOST = 'localhost'; process.env.DB_USER = 'user'; process.env.DB_PASSWORD = 'pass'; process.env.DB_NAME = 'db'; delete process.env.PORT; delete process.env.MAX_FILE_SIZE_MB; delete process.env.RETENTION_HOURS; delete process.env.WORKER_CONCURRENCY; const config = loadConfig(); expect(config.port).toBe(3000); expect(config.maxFileSizeMb).toBe(100); expect(config.retentionHours).toBe(1); expect(config.workerConcurrency).toBe(3); }); it('throws listing every missing required variable', () => { for (const key of REQUIRED_VARS) delete process.env[key]; expect(() => loadConfig()).toThrowError(/STORAGE_DIR.*DB_HOST.*DB_USER.*DB_PASSWORD.*DB_NAME/s); }); });