import { afterEach, describe, expect, it } from 'vitest'; import { loadApiEnv } from './app-config.service'; /** * Regression for the Test-stage boot crash after #80: compose passes * optional variables as empty strings (`SETUP_DEFAULT_LOCALE: ${…:-}`), * and a raw parse of process.env fails on enum fields. loadApiEnv must * treat them as unset — in main.ts exactly like in AppConfig. */ describe('loadApiEnv', () => { const touched = [ 'SETUP_DEFAULT_LOCALE', 'SETUP_REGISTRATION_MODE', 'SMTP_HOST', 'SMTP_PORT', 'SECRETS_FILE', 'DATABASE_URL', ] as const; const saved = Object.fromEntries(touched.map((key) => [key, process.env[key]])); afterEach(() => { for (const key of touched) { if (saved[key] === undefined) delete process.env[key]; else process.env[key] = saved[key]; } }); it('treats compose-passed empty strings as unset', () => { process.env.DATABASE_URL = 'postgresql://user:pass@localhost:5432/db'; process.env.SETUP_DEFAULT_LOCALE = ''; process.env.SETUP_REGISTRATION_MODE = ''; process.env.SMTP_HOST = ''; process.env.SMTP_PORT = ''; process.env.SECRETS_FILE = ''; const env = loadApiEnv(); expect(env.SETUP_DEFAULT_LOCALE).toBeUndefined(); expect(env.SETUP_REGISTRATION_MODE).toBeUndefined(); expect(env.SMTP_HOST).toBe('localhost'); // schema default, not "" expect(env.SMTP_PORT).toBe(1025); expect(env.SECRETS_FILE).toBe('./data/secrets.env'); }); });