390 lines
10 KiB
TypeScript
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();
|
|
});
|
|
});
|
|
});
|