import { describe, expect, test, vi } from 'vitest'; import { Config } from '../../source/services/config.ts'; /** * Tests that the config defaults to a 1 MiB request body limit. */ const testConfigDefaultsTo1MiBRequestBodyLimit = (): void => { const config = Config.from({ database: {}, server: {}, auth: {}, }); expect(config.server.maxRequestBodyBytes).toBe(1024 * 1024); expect(config.database.path).toBe('data.db'); expect(config.server.port).toBe(3000); expect(config.server.host).toBe('0.0.0.0'); expect(config.server.cors.origin).toBe('*'); expect(config.server.cors.methods).toEqual([ 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS' ]); expect(config.server.cors.allowedHeaders).toEqual([ 'Content-Type', 'cache-control', 'X-Timestamp', 'X-Public-Key', 'X-Signature' ]); expect(config.auth.timestampWindowMs).toBe(300000); }; /** * Tests that the config loads the request body limit from the environment. */ const testConfigLoadsRequestBodyLimitFromEnvironment = (): void => { vi.stubEnv('SERVER_MAX_REQUEST_BODY_BYTES', '2048'); expect(Config.fromEnv().server.maxRequestBodyBytes).toBe(2048); }; /** * Tests that the config rejects an invalid request body limit. */ const testConfigRejectsInvalidRequestBodyLimit = (): void => { expect(() => Config.from({ database: {}, server: { maxRequestBodyBytes: '0' }, auth: {}, })).toThrow(); }; /** * tests that the config loads the database path from the environment. */ const testConfigLoadsDatabasePathFromEnvironment = (): void => { vi.stubEnv('DATABASE_PATH', 'test.db'); expect(Config.fromEnv().database.path).toBe('test.db'); }; /** * tests that the config loads the server port from the environment. */ const testConfigLoadsServerPortFromEnvironment = (): void => { vi.stubEnv('SERVER_PORT', '3000'); expect(Config.fromEnv().server.port).toBe(3000); }; /** * tests that the config loads the server host from the environment. */ const testConfigLoadsServerHostFromEnvironment = (): void => { vi.stubEnv('SERVER_HOST', '0.0.0.0'); expect(Config.fromEnv().server.host).toBe('0.0.0.0'); }; /** * tests that the config loads the cors configuration from the environment. */ const testConfigLoadsCorsConfigurationFromEnvironment = (): void => { vi.stubEnv('CORS_ORIGIN', '*'); expect(Config.fromEnv().server.cors.origin).toBe('*'); }; /** * tests that the config loads the cors methods from the environment. */ const testConfigLoadsCorsMethodsFromEnvironment = (): void => { vi.stubEnv('CORS_METHODS', 'GET,POST,PUT,DELETE,OPTIONS'); expect(Config.fromEnv().server.cors.methods).toEqual([ 'GET', 'POST', 'PUT', 'DELETE', 'OPTIONS' ]); }; /** * tests that the config loads the cors allowed headers from the environment. */ const testConfigLoadsCorsAllowedHeadersFromEnvironment = (): void => { vi.stubEnv('CORS_ALLOWED_HEADERS', 'Content-Type,cache-control,X-Timestamp'); expect(Config.fromEnv().server.cors.allowedHeaders).toEqual([ 'Content-Type', 'cache-control', 'X-Timestamp' ]); }; /** * tests that the config loads the auth configuration from the environment. */ const testConfigLoadsAuthConfigurationFromEnvironment = (): void => { vi.stubEnv('AUTH_TIMESTAMP_WINDOW_MS', '1000'); expect(Config.fromEnv().auth.timestampWindowMs).toBe(1000); }; describe('Config', () => { test('defaults to a 1 MiB request body limit', testConfigDefaultsTo1MiBRequestBodyLimit); test('loads the request body limit from the environment', testConfigLoadsRequestBodyLimitFromEnvironment); test('rejects the invalid request body limit', testConfigRejectsInvalidRequestBodyLimit); test('loads the database path from the environment', testConfigLoadsDatabasePathFromEnvironment); test('loads the server port from the environment', testConfigLoadsServerPortFromEnvironment); test('loads the server host from the environment', testConfigLoadsServerHostFromEnvironment); test('loads the cors configuration from the environment', testConfigLoadsCorsConfigurationFromEnvironment); test('loads the cors methods from the environment', testConfigLoadsCorsMethodsFromEnvironment); test('loads the cors allowed headers from the environment', testConfigLoadsCorsAllowedHeadersFromEnvironment); test('loads the auth configuration from the environment', testConfigLoadsAuthConfigurationFromEnvironment); });