import { validateEnv } from './index'; const validEnv = { NODE_ENV: 'development', DATABASE_URL: 'postgresql://tower:tower_dev@localhost:5432/tower_dev', REDIS_URL: 'redis://localhost:6379', JWT_SECRET: 'a_super_secret_key_that_is_at_least_32_chars_long', } as unknown as NodeJS.ProcessEnv; describe('validateEnv', () => { it('returns parsed config for valid env', () => { const result = validateEnv(validEnv); expect(result.NODE_ENV).toBe('development'); expect(result.API_PORT).toBe(3001); }); it('applies default API_PORT of 3001 when not set', () => { const result = validateEnv(validEnv); expect(result.API_PORT).toBe(3001); }); it('throws when DATABASE_URL is missing', () => { const { DATABASE_URL, ...withoutDb } = validEnv as Record; expect(() => validateEnv(withoutDb as unknown as NodeJS.ProcessEnv), ).toThrow('Invalid environment variables'); }); it('throws when JWT_SECRET is shorter than 32 chars', () => { expect(() => validateEnv({ ...validEnv, JWT_SECRET: 'tooshort' } as unknown as NodeJS.ProcessEnv), ).toThrow('Invalid environment variables'); }); it('throws when DATABASE_URL is not a valid URL', () => { expect(() => validateEnv({ ...validEnv, DATABASE_URL: 'not-a-url' } as unknown as NodeJS.ProcessEnv), ).toThrow('Invalid environment variables'); }); it('applies default WHATSAPP_SESSION_PATH of ./sessions when not set', () => { const env = { DATABASE_URL: 'postgresql://user:pass@localhost:5432/db', REDIS_URL: 'redis://localhost:6379', JWT_SECRET: 'a'.repeat(32), }; const result = validateEnv(env as NodeJS.ProcessEnv); expect(result.WHATSAPP_SESSION_PATH).toBe('./sessions'); }); it('applies default TOWER_ADMIN_JIDS of empty string when not set', () => { const env = { DATABASE_URL: 'postgresql://user:pass@localhost:5432/db', REDIS_URL: 'redis://localhost:6379', JWT_SECRET: 'a'.repeat(32), }; const result = validateEnv(env as NodeJS.ProcessEnv); expect(result.TOWER_ADMIN_JIDS).toBe(''); }); });