import { vi } from 'vitest' /** * Default mock environment values for testing */ export const defaultMockEnv = { // Core DATABASE_URL: 'postgresql://test:test@localhost:5432/test', BETTER_AUTH_URL: 'https://test.sim.ai', BETTER_AUTH_SECRET: 'test-secret-that-is-at-least-32-chars-long', ENCRYPTION_KEY: 'test-encryption-key-32-chars-long!', INTERNAL_API_SECRET: 'test-internal-api-secret-32-chars!', // Email RESEND_API_KEY: 'test-resend-key', FROM_EMAIL_ADDRESS: 'Sim ', EMAIL_DOMAIN: 'test.sim.ai', PERSONAL_EMAIL_FROM: 'Test ', // URLs NEXT_PUBLIC_APP_URL: 'https://test.sim.ai', } /** * Creates a mock getEnv function that returns values from the provided env object */ export function createMockGetEnv(envValues: Record = defaultMockEnv) { return vi.fn((key: string) => envValues[key]) } /** * Creates a complete env mock object for use with vi.doMock * * @example * ```ts * vi.doMock('@/lib/core/config/env', () => createEnvMock()) * * // With custom values * vi.doMock('@/lib/core/config/env', () => createEnvMock({ * NEXT_PUBLIC_APP_URL: 'https://custom.example.com', * })) * ``` */ export function createEnvMock(overrides: Record = {}) { const envValues = { ...defaultMockEnv, ...overrides } return { env: envValues, getEnv: createMockGetEnv(envValues), isTruthy: (value: string | boolean | number | undefined) => typeof value === 'string' ? value.toLowerCase() === 'true' || value === '1' : Boolean(value), isFalsy: (value: string | boolean | number | undefined) => typeof value === 'string' ? value.toLowerCase() === 'false' || value === '0' : value === false, envBoolean: (value: boolean | string | undefined | null): boolean | undefined => { if (typeof value === 'boolean') return value if (value === undefined || value === null || value === '') return undefined const normalized = String(value).trim().toLowerCase() return ( normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on' ) }, envNumber: ( value: number | string | undefined | null, fallback: number, options: { min?: number } = {} ): number => { const min = options.min ?? 0 if (typeof value === 'number' && Number.isFinite(value) && value >= min) return value if (value === undefined || value === null || value === '') return fallback const parsed = Number(value) return Number.isFinite(parsed) && parsed >= min ? parsed : fallback }, } } /** * Pre-configured env mock for direct use with vi.mock * * @example * ```ts * vi.mock('@/lib/core/config/env', () => envMock) * ``` */ export const envMock = createEnvMock()