import { DyFM_EnvironmentFlag, DyFM_Log } from '@futdevpro/fsm-dynamo'; import { DyNTS_getEnvironment_settings } from './get-environment-settings.util'; describe('| DyNTS_getEnvironment_settings', () => { let originalEnv: string | undefined; let originalNodeEnv: string | undefined; let originalEnvironment: string | undefined; beforeEach(() => { // Save original environment variables originalEnv = process.env.ENV; originalNodeEnv = process.env.NODE_ENV; originalEnvironment = process.env.ENVIRONMENT; // Clear environment variables delete process.env.ENV; delete process.env.NODE_ENV; delete process.env.ENVIRONMENT; delete process.env.DISCORD_GUILD_ID; delete process.env.DISCORD_BOT_TOKEN; delete process.env.DISCORD_BOT_CLIENT_ID; delete process.env.DISCORD_BOT_OAUTH2_URL; delete process.env.MONGO_URL; delete process.env.MONGO_URI; delete process.env.OPENAI_API_KEY; delete process.env.OPENAI_ORGANIZATION; delete process.env.OPENAI_PROJECT; delete process.env.OPENAI_TTS_API_KEY; }); afterEach(() => { // Restore original environment variables if (originalEnv !== undefined) { process.env.ENV = originalEnv; } else { delete process.env.ENV; } if (originalNodeEnv !== undefined) { process.env.NODE_ENV = originalNodeEnv; } else { delete process.env.NODE_ENV; } if (originalEnvironment !== undefined) { process.env.ENVIRONMENT = originalEnvironment; } else { delete process.env.ENVIRONMENT; } }); it('| should return local environment when no environment variables are set', () => { const settings = DyNTS_getEnvironment_settings(); expect(settings.environment).toBe(DyFM_EnvironmentFlag.local); }); it('| should use ENV variable when set', () => { process.env.ENV = 'prod'; const settings = DyNTS_getEnvironment_settings(); expect(settings.environment).toBe(DyFM_EnvironmentFlag.prod); }); it('| should use NODE_ENV when ENV is not set', () => { process.env.NODE_ENV = 'dev'; const settings = DyNTS_getEnvironment_settings(); expect(settings.environment).toBe(DyFM_EnvironmentFlag.local); }); it('| should use ENVIRONMENT when ENV and NODE_ENV are not set', () => { process.env.ENVIRONMENT = 'test'; const settings = DyNTS_getEnvironment_settings(); expect(settings.environment).toBe(DyFM_EnvironmentFlag.local); }); it('| should prioritize ENV over NODE_ENV and ENVIRONMENT', () => { process.env.ENV = 'prod'; process.env.NODE_ENV = 'dev'; process.env.ENVIRONMENT = 'test'; const settings = DyNTS_getEnvironment_settings(); expect(settings.environment).toBe(DyFM_EnvironmentFlag.prod); }); it('| should handle lowercase environment values', () => { process.env.ENV = 'prod'; const settings = DyNTS_getEnvironment_settings(); expect(settings.environment).toBe(DyFM_EnvironmentFlag.prod); }); it('| should log error and use local for unknown environment', () => { const logSpy = spyOn(DyFM_Log, 'error'); process.env.ENV = 'unknown-env'; const settings = DyNTS_getEnvironment_settings(); expect(logSpy).toHaveBeenCalled(); expect(settings.environment).toBe(DyFM_EnvironmentFlag.local); }); it('| should return discord settings from environment variables', () => { process.env.DISCORD_GUILD_ID = 'guild123'; process.env.DISCORD_BOT_TOKEN = 'token123'; process.env.DISCORD_BOT_CLIENT_ID = 'client123'; process.env.DISCORD_BOT_OAUTH2_URL = 'https://discord.com/oauth2'; const settings = DyNTS_getEnvironment_settings(); expect(settings.discord.guildId).toBe('guild123'); expect(settings.discord.token).toBe('token123'); expect(settings.discord.clientId).toBe('client123'); expect(settings.discord.oauth2Url).toBe('https://discord.com/oauth2'); }); it('| should return undefined for discord settings when not set', () => { const settings = DyNTS_getEnvironment_settings(); expect(settings.discord.guildId).toBeUndefined(); expect(settings.discord.token).toBeUndefined(); expect(settings.discord.clientId).toBeUndefined(); expect(settings.discord.oauth2Url).toBeUndefined(); }); it('| should return mongoUri from MONGO_URL', () => { process.env.MONGO_URL = 'mongodb://localhost:27017'; const settings = DyNTS_getEnvironment_settings(); expect(settings.mongoUri).toBe('mongodb://localhost:27017'); }); it('| should return mongoUri from MONGO_URI when MONGO_URL is not set', () => { process.env.MONGO_URI = 'mongodb://localhost:27017'; const settings = DyNTS_getEnvironment_settings(); expect(settings.mongoUri).toBe('mongodb://localhost:27017'); }); it('| should prioritize MONGO_URL over MONGO_URI', () => { process.env.MONGO_URL = 'mongodb://localhost:27017'; process.env.MONGO_URI = 'mongodb://other:27017'; const settings = DyNTS_getEnvironment_settings(); expect(settings.mongoUri).toBe('mongodb://localhost:27017'); }); it('| should return undefined for mongoUri when not set', () => { const settings = DyNTS_getEnvironment_settings(); expect(settings.mongoUri).toBeUndefined(); }); it('| should return openAi settings from environment variables', () => { process.env.OPENAI_API_KEY = 'api-key-123'; process.env.OPENAI_ORGANIZATION = 'org-123'; process.env.OPENAI_PROJECT = 'project-123'; process.env.OPENAI_TTS_API_KEY = 'tts-key-123'; const settings = DyNTS_getEnvironment_settings(); expect(settings.openAi.apiKey).toBe('api-key-123'); expect(settings.openAi.organization).toBe('org-123'); expect(settings.openAi.project).toBe('project-123'); expect(settings.openAi.ttsApiKey).toBe('tts-key-123'); }); it('| should return undefined for openAi settings when not set', () => { const settings = DyNTS_getEnvironment_settings(); expect(settings.openAi.apiKey).toBeUndefined(); expect(settings.openAi.organization).toBeUndefined(); expect(settings.openAi.project).toBeUndefined(); expect(settings.openAi.ttsApiKey).toBeUndefined(); }); it('| should handle dotenv.config() being called', () => { // This test ensures that dotenv.config() is called without errors const settings = DyNTS_getEnvironment_settings(); expect(settings).toBeDefined(); expect(settings.environment).toBeDefined(); }); it('| should return consistent results on multiple calls', () => { const settings1 = DyNTS_getEnvironment_settings(); const settings2 = DyNTS_getEnvironment_settings(); expect(settings1.environment).toBe(settings2.environment); expect(settings1.discord).toEqual(settings2.discord); expect(settings1.mongoUri).toBe(settings2.mongoUri); expect(settings1.openAi).toEqual(settings2.openAi); }); it('| should handle mixed case environment variables', () => { process.env.ENV = 'PROD'; const settings = DyNTS_getEnvironment_settings(); // The function should handle case conversion expect(settings.environment).toBeDefined(); }); });