stock-bot/libs/core/queue/test/service-utils.test.ts
2025-06-25 11:38:23 -04:00

120 lines
4.1 KiB
TypeScript

import { describe, expect, it } from 'bun:test';
import {
generateCachePrefix,
getFullQueueName,
normalizeServiceName,
parseQueueName,
} from '../src/service-utils';
describe('Service Utils', () => {
describe('normalizeServiceName', () => {
it('should convert camelCase to kebab-case', () => {
expect(normalizeServiceName('myService')).toBe('my-service');
expect(normalizeServiceName('userAuthService')).toBe('user-auth-service');
expect(normalizeServiceName('APIGateway')).toBe('apigateway');
});
it('should handle already kebab-case names', () => {
expect(normalizeServiceName('my-service')).toBe('my-service');
expect(normalizeServiceName('user-auth-service')).toBe('user-auth-service');
});
it('should handle single word names', () => {
expect(normalizeServiceName('service')).toBe('service');
expect(normalizeServiceName('API')).toBe('api');
});
it('should handle empty string', () => {
expect(normalizeServiceName('')).toBe('');
});
});
describe('getFullQueueName', () => {
it('should generate queue name with service and handler', () => {
const name = getFullQueueName('userService', 'processUser');
expect(name).toBe('{user-service_processUser}');
});
it('should normalize service name but keep handler as-is', () => {
const name = getFullQueueName('APIGateway', 'handleRequest');
expect(name).toBe('{apigateway_handleRequest}');
});
it('should handle already normalized service name', () => {
const name = getFullQueueName('user-service', 'process-user');
expect(name).toBe('{user-service_process-user}');
});
});
describe('generateCachePrefix', () => {
it('should generate cache prefix for service', () => {
const prefix = generateCachePrefix('userService');
expect(prefix).toBe('cache:user-service');
});
it('should generate cache prefix for service only', () => {
const prefix = generateCachePrefix('userService');
expect(prefix).toBe('cache:user-service');
});
it('should normalize service names', () => {
const prefix = generateCachePrefix('APIGateway');
expect(prefix).toBe('cache:apigateway');
});
});
describe('parseQueueName', () => {
it('should parse valid queue name', () => {
const result = parseQueueName('{user-service_process-user}');
expect(result).toEqual({
service: 'user-service',
handler: 'process-user',
});
});
it('should return null for invalid format', () => {
expect(parseQueueName('invalid-queue-name')).toBeNull();
expect(parseQueueName('user-service_process-user')).toBeNull(); // Missing braces
expect(parseQueueName('{user-service-process-user}')).toBeNull(); // Missing underscore
expect(parseQueueName('{user-service_}')).toBeNull(); // Missing handler
expect(parseQueueName('{_process-user}')).toBeNull(); // Missing service
});
it('should handle queue names with multiple underscores', () => {
const result = parseQueueName('{user_service_process_user}');
expect(result).toEqual({
service: 'user',
handler: 'service_process_user',
});
});
});
describe('complete service utils workflow', () => {
it('should handle full queue name generation and parsing', () => {
// Generate a queue name
const serviceName = 'userService';
const handlerName = 'processOrder';
const queueName = getFullQueueName(serviceName, handlerName);
expect(queueName).toBe('{user-service_processOrder}');
// Parse it back
const parsed = parseQueueName(queueName);
expect(parsed).toEqual({
service: 'user-service',
handler: 'processOrder',
});
});
it('should handle cache prefix generation', () => {
const serviceName = 'orderService';
const cachePrefix = generateCachePrefix(serviceName);
expect(cachePrefix).toBe('cache:order-service');
// Use it for cache keys
const cacheKey = `${cachePrefix}:user:123`;
expect(cacheKey).toBe('cache:order-service:user:123');
});
});
});