hikma-engine
Version:
Code Knowledge Graph Indexer - A sophisticated TypeScript-based indexer that transforms Git repositories into multi-dimensional knowledge stores for AI agents
203 lines (202 loc) • 10 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const api_config_1 = require("./api-config");
describe('ApiConfigService', () => {
beforeEach(() => {
// Clear environment variables
delete process.env.HIKMA_API_PORT;
delete process.env.HIKMA_API_HOST;
delete process.env.HIKMA_API_CORS_ENABLED;
delete process.env.HIKMA_API_RATE_LIMIT_MAX_REQUESTS;
});
describe('Configuration Loading', () => {
it('should load default configuration', () => {
const config = api_config_1.apiConfig.getConfig();
expect(config.server.port).toBe(3000);
expect(config.server.host).toBe('localhost');
expect(config.cors.enabled).toBe(true);
expect(config.rateLimit.maxRequests).toBe(100);
expect(config.cache.enabled).toBe(true);
expect(config.monitoring.enabled).toBe(true);
});
it('should override configuration with environment variables', () => {
process.env.HIKMA_API_PORT = '4000';
process.env.HIKMA_API_HOST = '0.0.0.0';
process.env.HIKMA_API_CORS_ENABLED = 'false';
process.env.HIKMA_API_RATE_LIMIT_MAX_REQUESTS = '200';
// Create new instance to test environment variable loading
const testConfig = require('./api-config').apiConfig;
const config = testConfig.getConfig();
expect(config.server.port).toBe(4000);
expect(config.server.host).toBe('0.0.0.0');
expect(config.cors.enabled).toBe(false);
expect(config.rateLimit.maxRequests).toBe(200);
});
it('should handle array environment variables', () => {
process.env.HIKMA_API_CORS_ORIGINS = 'http://localhost:3000,https://example.com';
process.env.HIKMA_API_SEARCH_ALLOWED_FILE_TYPES = '.ts,.js,.py';
const testConfig = require('./api-config').apiConfig;
const config = testConfig.getConfig();
expect(config.cors.origins).toEqual(['http://localhost:3000', 'https://example.com']);
expect(config.search.filters.allowedFileTypes).toEqual(['.ts', '.js', '.py']);
});
});
describe('Configuration Validation', () => {
it('should validate valid configuration', () => {
expect(api_config_1.apiConfig.validateConfiguration()).toBe(true);
});
it('should reject invalid port numbers', () => {
expect(() => {
api_config_1.apiConfig.updateConfig({
server: {
...api_config_1.apiConfig.getServerConfig(),
port: 99999, // Invalid port
},
});
}).toThrow();
});
it('should reject invalid similarity thresholds', () => {
expect(() => {
api_config_1.apiConfig.updateConfig({
search: {
...api_config_1.apiConfig.getSearchConfig(),
thresholds: {
...api_config_1.apiConfig.getSearchConfig().thresholds,
minSimilarity: 1.5, // Invalid similarity
},
},
});
}).toThrow();
});
});
describe('Configuration Access Methods', () => {
it('should provide server configuration', () => {
const serverConfig = api_config_1.apiConfig.getServerConfig();
expect(serverConfig).toHaveProperty('port');
expect(serverConfig).toHaveProperty('host');
expect(serverConfig).toHaveProperty('timeout');
expect(serverConfig).toHaveProperty('maxRequestSize');
});
it('should provide cache configuration', () => {
const cacheConfig = api_config_1.apiConfig.getCacheConfig();
expect(cacheConfig).toHaveProperty('enabled');
expect(cacheConfig).toHaveProperty('ttl');
expect(cacheConfig).toHaveProperty('maxSize');
});
it('should provide search configuration', () => {
const searchConfig = api_config_1.apiConfig.getSearchConfig();
expect(searchConfig).toHaveProperty('limits');
expect(searchConfig).toHaveProperty('thresholds');
expect(searchConfig).toHaveProperty('filters');
expect(searchConfig).toHaveProperty('enhancement');
});
it('should provide monitoring configuration', () => {
const monitoringConfig = api_config_1.apiConfig.getMonitoringConfig();
expect(monitoringConfig).toHaveProperty('enabled');
expect(monitoringConfig).toHaveProperty('healthCheck');
expect(monitoringConfig).toHaveProperty('metrics');
expect(monitoringConfig).toHaveProperty('alerts');
});
it('should provide security configuration', () => {
const securityConfig = api_config_1.apiConfig.getSecurityConfig();
expect(securityConfig).toHaveProperty('apiKey');
expect(securityConfig).toHaveProperty('jwt');
expect(securityConfig).toHaveProperty('headers');
});
});
describe('Configuration Updates', () => {
it('should update configuration at runtime', () => {
const originalPort = api_config_1.apiConfig.getServerConfig().port;
api_config_1.apiConfig.updateConfig({
server: {
...api_config_1.apiConfig.getServerConfig(),
port: 4000,
},
});
expect(api_config_1.apiConfig.getServerConfig().port).toBe(4000);
// Restore original configuration
api_config_1.apiConfig.updateConfig({
server: {
...api_config_1.apiConfig.getServerConfig(),
port: originalPort,
},
});
});
it('should validate updates', () => {
expect(() => {
api_config_1.apiConfig.updateConfig({
server: {
...api_config_1.apiConfig.getServerConfig(),
port: -1, // Invalid port
},
});
}).toThrow();
});
});
describe('Configuration Summary', () => {
it('should provide configuration summary', () => {
const summary = api_config_1.apiConfig.getConfigSummary();
expect(summary).toHaveProperty('server');
expect(summary).toHaveProperty('cache');
expect(summary).toHaveProperty('security');
expect(summary).toHaveProperty('monitoring');
expect(summary).toHaveProperty('rateLimit');
expect(summary.server).toHaveProperty('port');
expect(summary.server).toHaveProperty('host');
expect(summary.cache).toHaveProperty('enabled');
expect(summary.security).toHaveProperty('apiKey');
expect(summary.monitoring).toHaveProperty('enabled');
expect(summary.rateLimit).toHaveProperty('enabled');
});
});
describe('Environment Variable Parsing', () => {
it('should parse boolean environment variables correctly', () => {
process.env.HIKMA_API_CACHE_ENABLED = 'true';
process.env.HIKMA_API_MONITORING_ENABLED = 'false';
const testConfig = require('./api-config').apiConfig;
const config = testConfig.getConfig();
expect(config.cache.enabled).toBe(true);
expect(config.monitoring.enabled).toBe(false);
});
it('should parse number environment variables correctly', () => {
process.env.HIKMA_API_CACHE_TTL_SEMANTIC = '1200';
process.env.HIKMA_API_SEARCH_MAX_RESULTS = '50';
const testConfig = require('./api-config').apiConfig;
const config = testConfig.getConfig();
expect(config.cache.ttl.semantic).toBe(1200);
expect(config.search.limits.maxResults).toBe(50);
});
it('should handle empty array environment variables', () => {
process.env.HIKMA_API_CORS_ORIGINS = '';
const testConfig = require('./api-config').apiConfig;
const config = testConfig.getConfig();
expect(config.cors.origins).toEqual([]);
});
it('should trim array values', () => {
process.env.HIKMA_API_CORS_ORIGINS = ' http://localhost:3000 , https://example.com ';
const testConfig = require('./api-config').apiConfig;
const config = testConfig.getConfig();
expect(config.cors.origins).toEqual(['http://localhost:3000', 'https://example.com']);
});
});
describe('Default Values', () => {
it('should use default values when environment variables are not set', () => {
const config = api_config_1.apiConfig.getConfig();
expect(config.server.port).toBe(3000);
expect(config.server.timeout).toBe(30000);
expect(config.rateLimit.windowMs).toBe(60000);
expect(config.cache.ttl.semantic).toBe(900);
expect(config.search.limits.maxResults).toBe(100);
expect(config.monitoring.healthCheck.interval).toBe(30000);
});
it('should use default arrays for file types and excluded directories', () => {
const config = api_config_1.apiConfig.getConfig();
expect(config.search.filters.allowedFileTypes).toContain('.ts');
expect(config.search.filters.allowedFileTypes).toContain('.js');
expect(config.search.filters.allowedFileTypes).toContain('.py');
expect(config.search.filters.excludedDirectories).toContain('node_modules');
expect(config.search.filters.excludedDirectories).toContain('dist');
expect(config.search.filters.excludedDirectories).toContain('.git');
});
});
});
;