import { describe, it, expect, afterEach } from 'vitest'; import { envFlagEnabled } from '../env-flag'; const NAME = 'ENV_FLAG_TEST_TRUSTED_INGRESS'; afterEach(() => { delete process.env[NAME]; }); describe('envFlagEnabled', () => { it('is false when unset', () => { expect(envFlagEnabled(NAME)).toBe(false); }); it('is false for empty / whitespace-only values', () => { for (const raw of ['', ' ', '\t\n']) { process.env[NAME] = raw; expect(envFlagEnabled(NAME)).toBe(false); } }); // The whole reason this predicate is shared: a producer using bare // `Boolean(process.env.X)` read every one of these as ENABLED, so an // operator typing `=0` to mean "off" got attacker-writable IP headers // trusted anyway. it('is false for explicit off values, case- and whitespace-insensitively', () => { for (const raw of ['0', 'false', 'off', 'FALSE', 'Off', ' 0 ', ' OFF ']) { process.env[NAME] = raw; expect(envFlagEnabled(NAME)).toBe(false); } }); it('is true for any other non-empty value', () => { for (const raw of ['1', 'true', 'TRUE', 'on', 'yes', ' 1 ']) { process.env[NAME] = raw; expect(envFlagEnabled(NAME)).toBe(true); } }); it('reads process.env per call, never module-hoisted', () => { expect(envFlagEnabled(NAME)).toBe(false); process.env[NAME] = '1'; expect(envFlagEnabled(NAME)).toBe(true); process.env[NAME] = '0'; expect(envFlagEnabled(NAME)).toBe(false); }); it('is reachable from the ./chat-protocol barrel', async () => { const barrel = await import('../index'); expect(barrel.envFlagEnabled).toBe(envFlagEnabled); }); });