import { describe, expect, it } from 'vitest'; import { loadConfig } from '../../src/config.js'; const base = { DATABASE_URL: 'postgres://localhost/staff', STANDALONE_TENANT_ID: '01ARZ3NDEKTSV4RRFFQ69G5FAV', STANDALONE_ACTOR_ID: '01J00000000000000000000001', }; describe('runtime modes', () => { it('allows the compatible standalone adapter', () => expect(loadConfig(base).STAFF_RUNTIME_MODE).toBe('standalone')); it('fails closed when platform contracts are missing', () => expect(() => loadConfig({ ...base, STAFF_RUNTIME_MODE: 'platform' })).toThrow( /PLATFORM_GATEWAY_URL/, )); it('rejects standalone mode in production', () => expect(() => loadConfig({ ...base, NODE_ENV: 'production' })).toThrow( /standalone is not allowed/, )); it('requires a standalone tenant ID', () => { expect(() => loadConfig({ ...base, STANDALONE_TENANT_ID: undefined })).toThrow( /STANDALONE_TENANT_ID/, ); }); it('allows the placeholder only in development on loopback', () => { expect( loadConfig({ ...base, NODE_ENV: 'development', HOST: '127.0.0.1', STANDALONE_TENANT_ID: '01J00000000000000000000000', }).STANDALONE_TENANT_ID, ).toBe('01J00000000000000000000000'); }); it('rejects the placeholder in production and development on a non-loopback host', () => { const placeholder = { ...base, STANDALONE_TENANT_ID: '01J00000000000000000000000', }; expect(() => loadConfig({ ...placeholder, NODE_ENV: 'production' })).toThrow( /allowed only in development on loopback/, ); expect(() => loadConfig({ ...placeholder, NODE_ENV: 'development', HOST: '0.0.0.0' })).toThrow( /allowed only in development on loopback/, ); }); it('treats empty optional platform variables as absent in compose', () => expect( loadConfig({ ...base, PLATFORM_GATEWAY_URL: '', PLATFORM_JWT_ISSUER: '', PLATFORM_JWT_AUDIENCE: '', PLATFORM_JWKS_URL: '', }).PLATFORM_GATEWAY_URL, ).toBeUndefined()); it('requires VAPID keys to be configured together if provided', () => { expect(() => loadConfig({ ...base, VAPID_PUBLIC_KEY: 'pubkey' })).toThrow( /VAPID_PUBLIC_KEY and VAPID_PRIVATE_KEY must be configured together/, ); expect(() => loadConfig({ ...base, VAPID_PRIVATE_KEY: 'privkey' })).toThrow( /VAPID_PUBLIC_KEY and VAPID_PRIVATE_KEY must be configured together/, ); const config = loadConfig({ ...base, VAPID_PUBLIC_KEY: 'pubkey', VAPID_PRIVATE_KEY: 'privkey', VAPID_SUBJECT: 'mailto:ops@krona.local', }); expect(config.VAPID_PUBLIC_KEY).toBe('pubkey'); expect(config.VAPID_PRIVATE_KEY).toBe('privkey'); expect(config.VAPID_SUBJECT).toBe('mailto:ops@krona.local'); }); });