import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { getWebsiteApiBaseUrl } from '../../../apps/website/lib/config/apiBaseUrl'; describe('getWebsiteApiBaseUrl()', () => { const originalEnv = process.env; beforeEach(() => { vi.resetModules(); process.env = { ...originalEnv }; // Clear relevant env vars delete process.env.NEXT_PUBLIC_API_BASE_URL; delete process.env.API_BASE_URL; delete process.env.NODE_ENV; delete process.env.CI; delete process.env.DOCKER; }); afterEach(() => { process.env = originalEnv; vi.unstubAllGlobals(); }); describe('Browser Context', () => { beforeEach(() => { vi.stubGlobal('window', {}); }); it('should use NEXT_PUBLIC_API_BASE_URL if provided', () => { process.env.NEXT_PUBLIC_API_BASE_URL = 'https://api.example.com/'; expect(getWebsiteApiBaseUrl()).toBe('https://api.example.com'); }); it('should throw if missing env in test-like environment (CI)', () => { process.env.CI = 'true'; expect(() => getWebsiteApiBaseUrl()).toThrow(/Missing NEXT_PUBLIC_API_BASE_URL/); }); it('should throw if missing env in test-like environment (DOCKER)', () => { process.env.DOCKER = 'true'; expect(() => getWebsiteApiBaseUrl()).toThrow(/Missing NEXT_PUBLIC_API_BASE_URL/); }); it('should fallback to localhost in development (non-docker)', () => { process.env.NODE_ENV = 'development'; expect(getWebsiteApiBaseUrl()).toBe('http://localhost:3001'); }); }); describe('Server Context', () => { beforeEach(() => { vi.stubGlobal('window', undefined); }); it('should prioritize API_BASE_URL over NEXT_PUBLIC_API_BASE_URL', () => { process.env.API_BASE_URL = 'https://internal-api.example.com'; process.env.NEXT_PUBLIC_API_BASE_URL = 'https://public-api.example.com'; expect(getWebsiteApiBaseUrl()).toBe('https://internal-api.example.com'); }); it('should use NEXT_PUBLIC_API_BASE_URL if API_BASE_URL is missing', () => { process.env.NEXT_PUBLIC_API_BASE_URL = 'https://public-api.example.com'; expect(getWebsiteApiBaseUrl()).toBe('https://public-api.example.com'); }); it('should throw if missing env in test-like environment (CI)', () => { process.env.CI = 'true'; expect(() => getWebsiteApiBaseUrl()).toThrow(/Missing API_BASE_URL/); }); it('should fallback to api:3000 in production (non-test environment)', () => { process.env.NODE_ENV = 'production'; expect(getWebsiteApiBaseUrl()).toBe('http://api:3000'); }); }); });