stock-bot/libs/core/di/test/registration.test.ts
2025-06-25 11:38:23 -04:00

390 lines
10 KiB
TypeScript

import { asClass, asFunction, asValue, createContainer } from 'awilix';
import { describe, expect, it, mock } from 'bun:test';
import {
registerApplicationServices,
registerCacheServices,
registerDatabaseServices,
} from '../src/registrations';
describe('DI Registrations', () => {
describe('registerCacheServices', () => {
it('should register null cache when redis disabled', () => {
const container = createContainer();
const config = {
service: {
name: 'test-service',
type: 'WORKER' as const,
},
redis: {
enabled: false,
host: 'localhost',
port: 6379,
},
} as any;
registerCacheServices(container, config);
const cache = container.resolve('cache');
expect(cache).toBeNull();
});
it('should register redis cache when redis config exists', () => {
const container = createContainer();
// Register logger first as it's a dependency
container.register({
logger: asValue({
info: () => {},
error: () => {},
warn: () => {},
debug: () => {},
}),
});
const config = {
service: {
name: 'test-service',
type: 'WORKER' as const,
},
redis: {
enabled: true,
host: 'localhost',
port: 6379,
db: 1,
},
} as any;
registerCacheServices(container, config);
const cache = container.resolve('cache');
expect(cache).toBeDefined();
});
it('should register both cache and globalCache', () => {
const container = createContainer();
// Register logger dependency
container.register({
logger: asValue({
info: () => {},
error: () => {},
warn: () => {},
debug: () => {},
}),
});
const config = {
service: {
name: 'test-service',
serviceName: 'test-service',
},
redis: {
enabled: true,
host: 'localhost',
port: 6379,
db: 1,
},
} as any;
registerCacheServices(container, config);
const cache = container.resolve('cache');
const globalCache = container.resolve('globalCache');
expect(cache).toBeDefined();
expect(globalCache).toBeDefined();
});
});
describe('registerDatabaseServices', () => {
it('should register MongoDB when config exists', () => {
const container = createContainer();
const mockLogger = {
info: () => {},
error: () => {},
warn: () => {},
debug: () => {},
};
container.register({
logger: asValue(mockLogger),
});
const config = {
service: {
name: 'test-service',
type: 'WORKER' as const,
},
mongodb: {
enabled: true,
uri: 'mongodb://localhost:27017',
database: 'test-db',
},
redis: { enabled: false, host: 'localhost', port: 6379 },
postgres: {
enabled: false,
host: 'localhost',
port: 5432,
database: 'test',
user: 'test',
password: 'test',
},
} as any;
registerDatabaseServices(container, config);
// Check that mongoClient is registered (not mongodb)
const registrations = container.registrations;
expect(registrations.mongoClient).toBeDefined();
});
it('should register Postgres when config exists', () => {
const container = createContainer();
const mockLogger = { info: () => {}, error: () => {} };
container.register({
logger: asValue(mockLogger),
});
const config = {
service: {
name: 'test-service',
type: 'WORKER' as const,
},
postgres: {
enabled: true,
host: 'localhost',
port: 5432,
database: 'test-db',
user: 'user',
password: 'pass',
},
mongodb: { enabled: false, uri: 'mongodb://localhost', database: 'test' },
redis: { enabled: false, host: 'localhost', port: 6379 },
} as any;
registerDatabaseServices(container, config);
const registrations = container.registrations;
expect(registrations.postgresClient).toBeDefined();
});
it('should register QuestDB when config exists', () => {
const container = createContainer();
const mockLogger = { info: () => {}, error: () => {} };
container.register({
logger: asValue(mockLogger),
});
const config = {
service: {
name: 'test-service',
type: 'WORKER' as const,
},
questdb: {
enabled: true,
host: 'localhost',
httpPort: 9000,
pgPort: 8812,
influxPort: 9009,
database: 'test',
},
mongodb: { enabled: false, uri: 'mongodb://localhost', database: 'test' },
postgres: {
enabled: false,
host: 'localhost',
port: 5432,
database: 'test',
user: 'test',
password: 'test',
},
redis: { enabled: false, host: 'localhost', port: 6379 },
} as any;
registerDatabaseServices(container, config);
const registrations = container.registrations;
expect(registrations.questdbClient).toBeDefined();
});
it('should register null for disabled databases', () => {
const container = createContainer();
const config = {
service: {
name: 'test-service',
type: 'WORKER' as const,
},
mongodb: { enabled: false, uri: 'mongodb://localhost', database: 'test' },
postgres: {
enabled: false,
host: 'localhost',
port: 5432,
database: 'test',
user: 'test',
password: 'test',
},
redis: { enabled: false, host: 'localhost', port: 6379 },
// questdb is optional
} as any;
registerDatabaseServices(container, config);
expect(container.resolve('mongoClient')).toBeNull();
expect(container.resolve('postgresClient')).toBeNull();
expect(container.resolve('questdbClient')).toBeNull();
});
});
describe('registerApplicationServices', () => {
it('should register browser service when config exists', () => {
const container = createContainer();
const mockLogger = { info: () => {}, error: () => {} };
container.register({
logger: asValue(mockLogger),
config: asValue({
browser: { headless: true },
}),
});
const config = {
service: {
name: 'test-service',
type: 'WORKER' as const,
},
browser: {
headless: true,
timeout: 30000,
},
redis: { enabled: true, host: 'localhost', port: 6379 },
mongodb: { enabled: false, uri: 'mongodb://localhost', database: 'test' },
postgres: {
enabled: false,
host: 'localhost',
port: 5432,
database: 'test',
user: 'test',
password: 'test',
},
} as any;
registerApplicationServices(container, config);
const registrations = container.registrations;
expect(registrations.browser).toBeDefined();
});
it('should register proxy service when config exists', () => {
const container = createContainer();
const mockLogger = { info: () => {}, error: () => {} };
container.register({
logger: asValue(mockLogger),
});
const config = {
service: {
name: 'test-service',
type: 'WORKER' as const,
},
proxy: {
enabled: true,
cachePrefix: 'proxy:',
ttl: 3600,
},
redis: { enabled: true, host: 'localhost', port: 6379 },
mongodb: { enabled: false, uri: 'mongodb://localhost', database: 'test' },
postgres: {
enabled: false,
host: 'localhost',
port: 5432,
database: 'test',
user: 'test',
password: 'test',
},
} as any;
registerApplicationServices(container, config);
const registrations = container.registrations;
expect(registrations.proxyManager).toBeDefined();
});
it('should register queue services when queue enabled', () => {
const container = createContainer();
const mockLogger = { info: () => {}, error: () => {} };
const mockHandlerRegistry = { getAllHandlers: () => [] };
container.register({
logger: asValue(mockLogger),
handlerRegistry: asValue(mockHandlerRegistry),
});
const config = {
service: {
name: 'test-service',
serviceName: 'test-service',
},
queue: {
enabled: true,
workers: 2,
concurrency: 5,
enableScheduledJobs: true,
defaultJobOptions: {},
},
redis: {
enabled: true,
host: 'localhost',
port: 6379,
},
mongodb: { enabled: false, uri: 'mongodb://localhost', database: 'test' },
postgres: {
enabled: false,
host: 'localhost',
port: 5432,
database: 'test',
user: 'test',
password: 'test',
},
} as any;
registerApplicationServices(container, config);
const registrations = container.registrations;
expect(registrations.queueManager).toBeDefined();
});
it('should not register queue when disabled', () => {
const container = createContainer();
const config = {
service: {
name: 'test-api',
type: 'API' as const,
},
queue: {
enabled: false,
},
redis: {
enabled: true,
host: 'localhost',
port: 6379,
},
mongodb: { enabled: false, uri: 'mongodb://localhost', database: 'test' },
postgres: {
enabled: false,
host: 'localhost',
port: 5432,
database: 'test',
user: 'test',
password: 'test',
},
} as any;
registerApplicationServices(container, config);
const registrations = container.registrations;
expect(registrations.queueManager).toBeDefined();
expect(container.resolve('queueManager')).toBeNull();
});
});
});