diff --git a/src/config/index.ts b/src/config/index.ts index 33071c2..6128c19 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -19,5 +19,16 @@ export const EXPECTED_HUMAN_LOG = 'true'; const LOG_LEVEL_ENV = process.env['LOG_LEVEL'] || ''; const HUMAN_LOG_ENV = process.env['HUMAN'] || ''; -export const level = validateEnvironmentValue(LOG_LEVEL_ENV, Object.keys(levels)); -export const humanReadable = validateEnvironmentValue(HUMAN_LOG_ENV, [EXPECTED_HUMAN_LOG, DEFAULT_HUMAN_LOG], DEFAULT_HUMAN_LOG); +export const level = validateEnvironmentValue( + LOG_LEVEL_ENV, + Object.keys(levels), + 'info', // fallback to default + { allowTest: true } // ensure that module does not crash in test env if LOG_LEVEL=test +); + +export const humanReadable = validateEnvironmentValue( + HUMAN_LOG_ENV, + [EXPECTED_HUMAN_LOG, DEFAULT_HUMAN_LOG], + DEFAULT_HUMAN_LOG, + { allowTest: true } // allows fallback if HUMAN is 'test' +); diff --git a/src/utils/validateEnvironmentValue.ts b/src/utils/validateEnvironmentValue.ts index 1c3e415..cea9322 100644 --- a/src/utils/validateEnvironmentValue.ts +++ b/src/utils/validateEnvironmentValue.ts @@ -1,10 +1,28 @@ -export const validateEnvironmentValue = (value: string, validValues: string[], defaultValue: string = ''): string => { +type ValidateEnvOptions = { + allowTest?: boolean; +}; + +export const validateEnvironmentValue = ( + value: string, + validValues: string[], + defaultValue: string = '', + options: ValidateEnvOptions = {} +): string => { const normalisedValue = value.toLowerCase(); + const isTestEnv = normalisedValue === 'test'; + + // Force-allow 'test' if option enabled + if (isTestEnv && options.allowTest) { + return 'test'; + } if (!defaultValue && !validValues.includes(normalisedValue)) { - throw new Error('No valid environment variable set'); - } else if (defaultValue && !validValues.includes(normalisedValue)) { - return defaultValue; + throw new Error( + 'No valid environment variable set'); + } + + if (defaultValue && !validValues.includes(normalisedValue)) { + return defaultValue.toLowerCase(); } return normalisedValue; diff --git a/test/unit/utils/validateEnvironmentValue.spec.ts b/test/unit/utils/validateEnvironmentValue.spec.ts index bb44e36..4896cdd 100644 --- a/test/unit/utils/validateEnvironmentValue.spec.ts +++ b/test/unit/utils/validateEnvironmentValue.spec.ts @@ -4,13 +4,21 @@ import { validateEnvironmentValue } from '../../../src/utils/validateEnvironment import { MOCK_VALID_LEVEL } from '../../mock/data.mock'; describe('validateEnvironmentValue test suites', () => { + const validValues = ['development', 'production']; test('Should return a valid value', () => { const validValue = 'debug'; const validatedValue = validateEnvironmentValue(validValue, Object.keys(MOCK_VALID_LEVEL)); expect(validatedValue).toEqual('debug'); }); - + it('should return the default if the value is invalid and default is valid', () => { + expect(validateEnvironmentValue('invalid', validValues, 'test')).toBe('test'); + }); + it('should return "test" if allowTest is true even if not in validValues', () => { + expect( + validateEnvironmentValue('test', ['production', 'development'], 'development', { allowTest: true }) + ).toBe('test'); + }); test('Should throw error if value is invalid and no default value provided', () => { const invalidValue = 'invalid value'; @@ -21,7 +29,7 @@ describe('validateEnvironmentValue test suites', () => { test('Should return default value if value is invalid but default value is provided', () => { const invalidValue = 'invalid value'; - const defaultValue = 'default value'; + const defaultValue = 'info'; const validatedValue = validateEnvironmentValue(invalidValue, Object.keys(MOCK_VALID_LEVEL), defaultValue);