From 1e9f98f2f9f2484dd200e2d0a203649f409cdbe2 Mon Sep 17 00:00:00 2001 From: malavya1411 Date: Tue, 14 Jul 2026 08:45:48 +0530 Subject: [PATCH] feat: require explicit ENVIRONMENT variable in configuration and update deployment environments --- .github/workflows/ci.yml | 1 + backend/src/__tests__/mock-gmail.test.ts | 17 +++++++++++++++++ backend/src/config/environment.ts | 10 +++++++--- docker-compose.yml | 1 + 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 54b7851..cfb4574 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,6 +70,7 @@ jobs: run: npm run test env: DATABASE_URL: postgresql://postgres:postgres@localhost:5432/inboxos_test + ENVIRONMENT: local # ========================================== # Frontend Jobs diff --git a/backend/src/__tests__/mock-gmail.test.ts b/backend/src/__tests__/mock-gmail.test.ts index 9564b9a..c61c2eb 100644 --- a/backend/src/__tests__/mock-gmail.test.ts +++ b/backend/src/__tests__/mock-gmail.test.ts @@ -57,6 +57,23 @@ describe('Three-Tier Environment System & Mock Gmail Client', () => { expect(message.data.payload.parts).toBeDefined(); }); + it('should throw an error if ENVIRONMENT is not explicitly set', () => { + delete process.env.ENVIRONMENT; + expect(() => { + require('../config/environment'); + }).toThrow(/ENVIRONMENT must be explicitly set/); + }); + + it('should successfully boot with prod URL if ENVIRONMENT=production', () => { + process.env.ENVIRONMENT = 'production'; + process.env.DATABASE_URL = + 'postgresql://user:pass@my-supabase-prod.supabase.co:5432/db'; + + expect(() => { + require('../config/environment'); + }).not.toThrow(); + }); + it('should refuse to boot and throw error if MOCK_GMAIL=true but ENVIRONMENT=production', () => { process.env.MOCK_GMAIL = 'true'; process.env.ENVIRONMENT = 'production'; diff --git a/backend/src/config/environment.ts b/backend/src/config/environment.ts index 6579bf6..92a0880 100644 --- a/backend/src/config/environment.ts +++ b/backend/src/config/environment.ts @@ -1,17 +1,21 @@ import { logger } from '../utils/logger'; // Load variables -export const ENVIRONMENT = process.env.ENVIRONMENT || 'local'; +export const ENVIRONMENT = process.env.ENVIRONMENT; export const MOCK_GMAIL = process.env.MOCK_GMAIL === 'true'; // Validate values const validEnvironments = ['local', 'staging', 'production']; -if (!validEnvironments.includes(ENVIRONMENT)) { - const errMsg = `CRITICAL CONFIG FAILURE: Invalid ENVIRONMENT value "${ENVIRONMENT}". Must be one of: ${validEnvironments.join(', ')}`; +if (!ENVIRONMENT || !validEnvironments.includes(ENVIRONMENT)) { + const errMsg = `CRITICAL CONFIG FAILURE: Invalid ENVIRONMENT value "${ENVIRONMENT}". ENVIRONMENT must be explicitly set and must be one of: ${validEnvironments.join(', ')}`; logger.error(errMsg); throw new Error(errMsg); } +logger.info( + `[Environment] Successfully initialized with ENVIRONMENT=${ENVIRONMENT}` +); + // 1. Mock mode requires BOTH MOCK_GMAIL=true AND ENVIRONMENT=local export const IS_MOCK = MOCK_GMAIL && ENVIRONMENT === 'local'; diff --git a/docker-compose.yml b/docker-compose.yml index 6dd9a42..3fbd9f2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -50,6 +50,7 @@ services: environment: - PORT=8000 - NODE_ENV=development + - ENVIRONMENT=local - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/inboxos?schema=public - REDIS_URL=redis://redis:6379/0 - JWT_SECRET=replace_with_random_64_char_hex_string_for_dev_mode_only