trying to figure out the issue with logger tests
This commit is contained in:
parent
6aa63a8b59
commit
d836e766d5
5 changed files with 127 additions and 93 deletions
|
|
@ -11,7 +11,7 @@ export const loggingConfig = cleanEnv(process.env, {
|
||||||
// Basic Logging Settings
|
// Basic Logging Settings
|
||||||
LOG_LEVEL: str({
|
LOG_LEVEL: str({
|
||||||
default: 'info',
|
default: 'info',
|
||||||
choices: ['error', 'warn', 'info', 'http', 'verbose', 'debug', 'silly'],
|
choices: ['debug' , 'info' , 'warn' , 'error'],
|
||||||
desc: 'Logging level'
|
desc: 'Logging level'
|
||||||
}),
|
}),
|
||||||
LOG_FORMAT: str({
|
LOG_FORMAT: str({
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,15 @@ import { loggerTestHelpers } from './setup';
|
||||||
|
|
||||||
describe('Advanced Logger Features', () => {
|
describe('Advanced Logger Features', () => {
|
||||||
let logger: Logger;
|
let logger: Logger;
|
||||||
|
let testLoggerInstance: ReturnType<typeof loggerTestHelpers.createTestLogger>;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
loggerTestHelpers.clearCapturedLogs();
|
testLoggerInstance = loggerTestHelpers.createTestLogger('advanced-features');
|
||||||
logger = loggerTestHelpers.createTestLogger('advanced-features');
|
logger = testLoggerInstance.logger;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
loggerTestHelpers.clearCapturedLogs();
|
testLoggerInstance.clearCapturedLogs();
|
||||||
// Force garbage collection to clean up any potential circular references
|
// Force garbage collection to clean up any potential circular references
|
||||||
if (global.gc) {
|
if (global.gc) {
|
||||||
global.gc();
|
global.gc();
|
||||||
|
|
@ -34,7 +36,7 @@ describe('Advanced Logger Features', () => {
|
||||||
|
|
||||||
logger.info('Complex operation', complexMetadata);
|
logger.info('Complex operation', complexMetadata);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].user).toEqual({ id: '123', name: 'John Doe' });
|
expect(logs[0].user).toEqual({ id: '123', name: 'John Doe' });
|
||||||
expect(logs[0].session).toEqual({ id: 'sess-456', timeout: 3600 });
|
expect(logs[0].session).toEqual({ id: 'sess-456', timeout: 3600 });
|
||||||
|
|
@ -49,7 +51,7 @@ describe('Advanced Logger Features', () => {
|
||||||
|
|
||||||
logger.info('Array metadata test', arrayMetadata);
|
logger.info('Array metadata test', arrayMetadata);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].tags).toEqual(['user', 'authentication', 'success']);
|
expect(logs[0].tags).toEqual(['user', 'authentication', 'success']);
|
||||||
expect(logs[0].ids).toEqual([1, 2, 3, 4]);
|
expect(logs[0].ids).toEqual([1, 2, 3, 4]);
|
||||||
|
|
@ -65,7 +67,7 @@ describe('Advanced Logger Features', () => {
|
||||||
|
|
||||||
logger.info('Null metadata test', nullMetadata);
|
logger.info('Null metadata test', nullMetadata);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].nullValue).toBe(null);
|
expect(logs[0].nullValue).toBe(null);
|
||||||
expect(logs[0].emptyString).toBe('');
|
expect(logs[0].emptyString).toBe('');
|
||||||
|
|
@ -82,7 +84,7 @@ describe('Advanced Logger Features', () => {
|
||||||
|
|
||||||
childLogger.info('Child logger message');
|
childLogger.info('Child logger message');
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].component).toBe('auth-service');
|
expect(logs[0].component).toBe('auth-service');
|
||||||
expect(logs[0].version).toBe('1.2.3');
|
expect(logs[0].version).toBe('1.2.3');
|
||||||
|
|
@ -95,7 +97,7 @@ describe('Advanced Logger Features', () => {
|
||||||
|
|
||||||
grandChildLogger.warn('Nested child message');
|
grandChildLogger.warn('Nested child message');
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level1).toBe('parent');
|
expect(logs[0].level1).toBe('parent');
|
||||||
expect(logs[0].level2).toBe('child');
|
expect(logs[0].level2).toBe('child');
|
||||||
|
|
@ -110,7 +112,7 @@ describe('Advanced Logger Features', () => {
|
||||||
duration: 150
|
duration: 150
|
||||||
});
|
});
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].service).toBe('api');
|
expect(logs[0].service).toBe('api');
|
||||||
expect(logs[0].requestId).toBe('req-789');
|
expect(logs[0].requestId).toBe('req-789');
|
||||||
|
|
@ -126,7 +128,7 @@ describe('Advanced Logger Features', () => {
|
||||||
|
|
||||||
logger.error('Custom error occurred', { error: customError });
|
logger.error('Custom error occurred', { error: customError });
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level).toBe('error');
|
expect(logs[0].level).toBe('error');
|
||||||
expect(logs[0].msg).toBe('Custom error occurred');
|
expect(logs[0].msg).toBe('Custom error occurred');
|
||||||
|
|
@ -142,7 +144,7 @@ describe('Advanced Logger Features', () => {
|
||||||
context: 'batch processing'
|
context: 'batch processing'
|
||||||
});
|
});
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].context).toBe('batch processing');
|
expect(logs[0].context).toBe('batch processing');
|
||||||
});
|
});
|
||||||
|
|
@ -157,7 +159,7 @@ describe('Advanced Logger Features', () => {
|
||||||
logger.error('Circular error test', { error: errorWithCircular });
|
logger.error('Circular error test', { error: errorWithCircular });
|
||||||
}).not.toThrow();
|
}).not.toThrow();
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level).toBe('error');
|
expect(logs[0].level).toBe('error');
|
||||||
});
|
});
|
||||||
|
|
@ -171,7 +173,7 @@ describe('Advanced Logger Features', () => {
|
||||||
|
|
||||||
logger.debug('Moderate metadata test', moderateMetadata);
|
logger.debug('Moderate metadata test', moderateMetadata);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].key0).toBe('value0');
|
expect(logs[0].key0).toBe('value0');
|
||||||
expect(logs[0].key9).toBe('value9');
|
expect(logs[0].key9).toBe('value9');
|
||||||
|
|
@ -182,7 +184,7 @@ describe('Advanced Logger Features', () => {
|
||||||
|
|
||||||
logger.info(specialMessage);
|
logger.info(specialMessage);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].msg).toBe(specialMessage);
|
expect(logs[0].msg).toBe(specialMessage);
|
||||||
});
|
});
|
||||||
|
|
@ -191,7 +193,7 @@ describe('Advanced Logger Features', () => {
|
||||||
logger.info('');
|
logger.info('');
|
||||||
logger.info(' ');
|
logger.info(' ');
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(2);
|
expect(logs.length).toBe(2);
|
||||||
expect(logs[0].msg).toBe('');
|
expect(logs[0].msg).toBe('');
|
||||||
expect(logs[1].msg).toBe(' ');
|
expect(logs[1].msg).toBe(' ');
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,15 @@ import { loggerTestHelpers } from './setup';
|
||||||
|
|
||||||
describe('Basic Logger Tests', () => {
|
describe('Basic Logger Tests', () => {
|
||||||
let logger: Logger;
|
let logger: Logger;
|
||||||
|
let testLoggerInstance: ReturnType<typeof loggerTestHelpers.createTestLogger>;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
loggerTestHelpers.clearCapturedLogs();
|
testLoggerInstance = loggerTestHelpers.createTestLogger('utils-test');
|
||||||
logger = loggerTestHelpers.createTestLogger('utils-test');
|
logger = testLoggerInstance.logger;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
loggerTestHelpers.clearCapturedLogs();
|
testLoggerInstance.clearCapturedLogs();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Logger Factory Functions', () => {
|
describe('Logger Factory Functions', () => {
|
||||||
|
|
@ -26,8 +27,8 @@ describe('Basic Logger Tests', () => {
|
||||||
|
|
||||||
// Test that getLogger doesn't throw
|
// Test that getLogger doesn't throw
|
||||||
expect(() => {
|
expect(() => {
|
||||||
const testLogger = loggerTestHelpers.createTestLogger('factory-test');
|
const anotherTestLoggerInstance = loggerTestHelpers.createTestLogger('factory-test');
|
||||||
testLogger.info('Factory test');
|
anotherTestLoggerInstance.logger.info('Factory test');
|
||||||
}).not.toThrow();
|
}).not.toThrow();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -55,7 +56,7 @@ describe('Basic Logger Tests', () => {
|
||||||
// Object message
|
// Object message
|
||||||
logger.info({ event: 'object_message', data: 'test' });
|
logger.info({ event: 'object_message', data: 'test' });
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(2);
|
expect(logs.length).toBe(2);
|
||||||
expect(logs[0].msg).toBe('String message');
|
expect(logs[0].msg).toBe('String message');
|
||||||
expect(logs[1].level).toBe('info');
|
expect(logs[1].level).toBe('info');
|
||||||
|
|
@ -70,7 +71,7 @@ describe('Basic Logger Tests', () => {
|
||||||
|
|
||||||
logger.info('Request processed', metadata);
|
logger.info('Request processed', metadata);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].userId).toBe('user123');
|
expect(logs[0].userId).toBe('user123');
|
||||||
expect(logs[0].sessionId).toBe('session456');
|
expect(logs[0].sessionId).toBe('session456');
|
||||||
|
|
@ -87,7 +88,7 @@ describe('Basic Logger Tests', () => {
|
||||||
|
|
||||||
childLogger.info('Payment processed');
|
childLogger.info('Payment processed');
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].msg).toBe('Payment processed');
|
expect(logs[0].msg).toBe('Payment processed');
|
||||||
});
|
});
|
||||||
|
|
@ -96,7 +97,7 @@ describe('Basic Logger Tests', () => {
|
||||||
const childLogger = logger.child({ operation: 'test' });
|
const childLogger = logger.child({ operation: 'test' });
|
||||||
childLogger.info('Child operation');
|
childLogger.info('Child operation');
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].service).toBe('utils-test');
|
expect(logs[0].service).toBe('utils-test');
|
||||||
});
|
});
|
||||||
|
|
@ -109,7 +110,7 @@ describe('Basic Logger Tests', () => {
|
||||||
|
|
||||||
logger.error('Error test', error);
|
logger.error('Error test', error);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level).toBe('error');
|
expect(logs[0].level).toBe('error');
|
||||||
});
|
});
|
||||||
|
|
@ -123,7 +124,7 @@ describe('Basic Logger Tests', () => {
|
||||||
|
|
||||||
logger.error('Validation failed', { error: errorLike });
|
logger.error('Validation failed', { error: errorLike });
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level).toBe('error');
|
expect(logs[0].level).toBe('error');
|
||||||
});
|
});
|
||||||
|
|
@ -131,7 +132,7 @@ describe('Basic Logger Tests', () => {
|
||||||
it('should handle primitive error values', () => {
|
it('should handle primitive error values', () => {
|
||||||
logger.error('Simple error', { error: 'Error string' });
|
logger.error('Simple error', { error: 'Error string' });
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level).toBe('error');
|
expect(logs[0].level).toBe('error');
|
||||||
});
|
});
|
||||||
|
|
@ -144,7 +145,7 @@ describe('Basic Logger Tests', () => {
|
||||||
logger.warn('Warn message');
|
logger.warn('Warn message');
|
||||||
logger.error('Error message');
|
logger.error('Error message');
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(4);
|
expect(logs.length).toBe(4);
|
||||||
|
|
||||||
logs.forEach(log => {
|
logs.forEach(log => {
|
||||||
|
|
@ -153,16 +154,22 @@ describe('Basic Logger Tests', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should support different service names', () => {
|
it('should support different service names', () => {
|
||||||
const logger1 = loggerTestHelpers.createTestLogger('service-one');
|
const logger1Instance = loggerTestHelpers.createTestLogger('service-one');
|
||||||
const logger2 = loggerTestHelpers.createTestLogger('service-two');
|
const logger2Instance = loggerTestHelpers.createTestLogger('service-two');
|
||||||
|
|
||||||
logger1.info('Message from service one');
|
logger1Instance.logger.info('Message from service one');
|
||||||
logger2.info('Message from service two');
|
logger2Instance.logger.info('Message from service two');
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
// Since each logger instance has its own capture, we check them separately
|
||||||
expect(logs.length).toBe(2);
|
// or combine them if that's the desired test logic.
|
||||||
expect(logs[0].service).toBe('service-one');
|
// For this test, it seems we want to ensure they are separate.
|
||||||
expect(logs[1].service).toBe('service-two');
|
const logs1 = logger1Instance.getCapturedLogs();
|
||||||
|
expect(logs1.length).toBe(1);
|
||||||
|
expect(logs1[0].service).toBe('service-one');
|
||||||
|
|
||||||
|
const logs2 = logger2Instance.getCapturedLogs();
|
||||||
|
expect(logs2.length).toBe(1);
|
||||||
|
expect(logs2[0].service).toBe('service-two');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -14,15 +14,15 @@ import { loggerTestHelpers } from './setup';
|
||||||
|
|
||||||
describe('Logger Integration Tests', () => {
|
describe('Logger Integration Tests', () => {
|
||||||
let logger: Logger;
|
let logger: Logger;
|
||||||
|
let testLoggerInstance: ReturnType<typeof loggerTestHelpers.createTestLogger>;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
// Create a new test logger before each test
|
testLoggerInstance = loggerTestHelpers.createTestLogger('integration-test');
|
||||||
loggerTestHelpers.clearCapturedLogs();
|
logger = testLoggerInstance.logger;
|
||||||
logger = loggerTestHelpers.createTestLogger('integration-test');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
loggerTestHelpers.clearCapturedLogs();
|
testLoggerInstance.clearCapturedLogs();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Core Logger Functionality', () => {
|
describe('Core Logger Functionality', () => {
|
||||||
|
|
@ -34,7 +34,7 @@ describe('Logger Integration Tests', () => {
|
||||||
logger.error('Error message');
|
logger.error('Error message');
|
||||||
|
|
||||||
// Get captured logs
|
// Get captured logs
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
|
|
||||||
// Verify logs were captured
|
// Verify logs were captured
|
||||||
expect(logs.length).toBe(4);
|
expect(logs.length).toBe(4);
|
||||||
|
|
@ -53,7 +53,7 @@ describe('Logger Integration Tests', () => {
|
||||||
logger.info('User logged in', { userId: '123', action: 'login' });
|
logger.info('User logged in', { userId: '123', action: 'login' });
|
||||||
|
|
||||||
// Get captured logs
|
// Get captured logs
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
|
|
||||||
// Verify structured log
|
// Verify structured log
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
|
|
@ -69,7 +69,7 @@ describe('Logger Integration Tests', () => {
|
||||||
logger.error('Something went wrong', { error: testError });
|
logger.error('Something went wrong', { error: testError });
|
||||||
|
|
||||||
// Get captured logs
|
// Get captured logs
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
|
|
||||||
// Verify error was logged
|
// Verify error was logged
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
|
|
@ -88,7 +88,7 @@ describe('Logger Integration Tests', () => {
|
||||||
childLogger.info('Child logger test');
|
childLogger.info('Child logger test');
|
||||||
|
|
||||||
// Get captured logs
|
// Get captured logs
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
|
|
||||||
// Verify child logger logged something
|
// Verify child logger logged something
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
|
|
@ -104,17 +104,19 @@ describe('Logger Integration Tests', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create different logger instances', () => {
|
it('should create different logger instances', () => {
|
||||||
const logger1 = loggerTestHelpers.createTestLogger('service-1');
|
const logger1Instance = loggerTestHelpers.createTestLogger('service-1');
|
||||||
const logger2 = loggerTestHelpers.createTestLogger('service-2');
|
const logger2Instance = loggerTestHelpers.createTestLogger('service-2');
|
||||||
|
|
||||||
logger1.info('Message from service 1');
|
logger1Instance.logger.info('Message from service 1');
|
||||||
logger2.info('Message from service 2');
|
logger2Instance.logger.info('Message from service 2');
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs1 = logger1Instance.getCapturedLogs();
|
||||||
|
expect(logs1.length).toBe(1);
|
||||||
expect(logs.length).toBe(2);
|
expect(logs1[0].service).toBe('service-1');
|
||||||
expect(logs[0].service).toBe('service-1');
|
|
||||||
expect(logs[1].service).toBe('service-2');
|
const logs2 = logger2Instance.getCapturedLogs();
|
||||||
|
expect(logs2.length).toBe(1);
|
||||||
|
expect(logs2[0].service).toBe('service-2');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -125,7 +127,7 @@ describe('Logger Integration Tests', () => {
|
||||||
|
|
||||||
logger.error('Error occurred', error);
|
logger.error('Error occurred', error);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level).toBe('error');
|
expect(logs[0].level).toBe('error');
|
||||||
expect(logs[0].msg).toBe('Error occurred');
|
expect(logs[0].msg).toBe('Error occurred');
|
||||||
|
|
@ -140,7 +142,7 @@ describe('Logger Integration Tests', () => {
|
||||||
|
|
||||||
logger.error('Custom error occurred', { error: errorLike });
|
logger.error('Custom error occurred', { error: errorLike });
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level).toBe('error');
|
expect(logs[0].level).toBe('error');
|
||||||
expect(logs[0].msg).toBe('Custom error occurred');
|
expect(logs[0].msg).toBe('Custom error occurred');
|
||||||
|
|
@ -149,7 +151,7 @@ describe('Logger Integration Tests', () => {
|
||||||
it('should handle primitive error values', () => {
|
it('should handle primitive error values', () => {
|
||||||
logger.error('String error occurred', { error: 'Simple string error' });
|
logger.error('String error occurred', { error: 'Simple string error' });
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level).toBe('error');
|
expect(logs[0].level).toBe('error');
|
||||||
expect(logs[0].msg).toBe('String error occurred');
|
expect(logs[0].msg).toBe('String error occurred');
|
||||||
|
|
@ -166,7 +168,7 @@ describe('Logger Integration Tests', () => {
|
||||||
|
|
||||||
logger.info('Operation completed', metadata);
|
logger.info('Operation completed', metadata);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].requestId).toBe('req-123');
|
expect(logs[0].requestId).toBe('req-123');
|
||||||
expect(logs[0].userId).toBe('user-456');
|
expect(logs[0].userId).toBe('user-456');
|
||||||
|
|
@ -182,7 +184,7 @@ describe('Logger Integration Tests', () => {
|
||||||
|
|
||||||
logger.info(objectMessage);
|
logger.info(objectMessage);
|
||||||
|
|
||||||
const logs = loggerTestHelpers.getCapturedLogs();
|
const logs = testLoggerInstance.getCapturedLogs();
|
||||||
expect(logs.length).toBe(1);
|
expect(logs.length).toBe(1);
|
||||||
expect(logs[0].level).toBe('info');
|
expect(logs[0].level).toBe('info');
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
* Provides utilities and mocks for testing logging operations.
|
* Provides utilities and mocks for testing logging operations.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Logger } from '../src';
|
import { Logger, LogMetadata } from '../src';
|
||||||
import { afterAll, afterEach, beforeAll, beforeEach } from 'bun:test';
|
import { afterAll, afterEach, beforeAll, beforeEach } from 'bun:test';
|
||||||
|
|
||||||
// Store original console methods
|
// Store original console methods
|
||||||
|
|
@ -17,43 +17,66 @@ const originalConsole = {
|
||||||
debug: console.debug
|
debug: console.debug
|
||||||
};
|
};
|
||||||
|
|
||||||
// Storage for captured logs
|
|
||||||
let capturedLogs: any[] = [];
|
|
||||||
|
|
||||||
// Create a test logger helper
|
// Create a test logger helper
|
||||||
export const loggerTestHelpers = { /**
|
export const loggerTestHelpers = {
|
||||||
* Create a test logger instance that captures logs instead of outputting them
|
/**
|
||||||
*/ createTestLogger: (serviceName: string = 'test-service', context: any = {}) => {
|
* Create a test logger instance that captures logs locally.
|
||||||
// Create a fully mocked Logger instance without using the real Logger class
|
*/
|
||||||
const logger = {
|
createTestLogger: (serviceName: string = 'test-service', initialContext: any = {}) => {
|
||||||
serviceName,
|
const capturedLogsArray: any[] = [];
|
||||||
context,
|
|
||||||
debug: (msg: string, metadata?: any) => capturedLogs.push({ level: 'debug', msg, service: serviceName, ...context, ...metadata }),
|
const createLoggerMockInstance = (currentContext: any): Logger => {
|
||||||
info: (msg: string, metadata?: any) => capturedLogs.push({ level: 'info', msg, service: serviceName, ...context, ...metadata }),
|
const buildLogEntry = (level: string, messageOrObject: string | object, metadata?: any) => {
|
||||||
warn: (msg: string, metadata?: any) => capturedLogs.push({ level: 'warn', msg, service: serviceName, ...context, ...metadata }),
|
const logObject: any = { level, service: serviceName, ...currentContext };
|
||||||
error: (msg: string, metadata?: any) => capturedLogs.push({ level: 'error', msg, service: serviceName, ...context, ...metadata }),
|
|
||||||
http: (msg: string, metadata?: any) => capturedLogs.push({ level: 'http', msg, service: serviceName, ...context, ...metadata }),
|
if (typeof messageOrObject === 'string') {
|
||||||
verbose: (msg: string, metadata?: any) => capturedLogs.push({ level: 'verbose', msg, service: serviceName, ...context, ...metadata }),
|
logObject.msg = messageOrObject;
|
||||||
silly: (msg: string, metadata?: any) => capturedLogs.push({ level: 'silly', msg, service: serviceName, ...context, ...metadata }),
|
if (metadata) {
|
||||||
child: (childContext: any) => {
|
Object.assign(logObject, metadata);
|
||||||
return loggerTestHelpers.createTestLogger(serviceName, { ...context, ...childContext });
|
}
|
||||||
|
} else { // messageOrObject is an object
|
||||||
|
Object.assign(logObject, messageOrObject); // Merge fields from the message object
|
||||||
|
if (metadata) { // If metadata is also provided (e.g. logger.error({code: 1}, {extra: 'data'}))
|
||||||
|
Object.assign(logObject, metadata);
|
||||||
|
}
|
||||||
|
// Ensure 'msg' field exists, defaulting if necessary
|
||||||
|
if (typeof logObject.msg === 'undefined') {
|
||||||
|
// If the second arg was a string, it might have been intended as the message
|
||||||
|
if (typeof metadata === 'string') {
|
||||||
|
logObject.msg = metadata;
|
||||||
|
} else {
|
||||||
|
logObject.msg = 'Object logged';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
capturedLogsArray.push(logObject);
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
// serviceName, // For inspection if needed, though logs capture it
|
||||||
|
context: currentContext, // For inspection
|
||||||
|
debug: (msgOrObj: string | object, meta?: any) => buildLogEntry('debug', msgOrObj, meta),
|
||||||
|
info: (msgOrObj: string | object, meta?: any) => buildLogEntry('info', msgOrObj, meta),
|
||||||
|
warn: (msgOrObj: string | object, meta?: any) => buildLogEntry('warn', msgOrObj, meta),
|
||||||
|
error: (msgOrObj: string | object, metaOrMsg?: any) => buildLogEntry('error', msgOrObj, metaOrMsg),
|
||||||
|
child: (childContext: any): Logger => {
|
||||||
|
// Children will log to the same capturedLogsArray
|
||||||
|
return createLoggerMockInstance({ ...currentContext, ...childContext });
|
||||||
|
}
|
||||||
|
} as any; // Cast to Logger, assuming it fulfills the interface for testing purposes
|
||||||
|
};
|
||||||
|
|
||||||
|
const loggerInstance = createLoggerMockInstance(initialContext);
|
||||||
|
|
||||||
|
return {
|
||||||
|
logger: loggerInstance,
|
||||||
|
getCapturedLogs: () => [...capturedLogsArray],
|
||||||
|
clearCapturedLogs: () => {
|
||||||
|
capturedLogsArray.length = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return logger as unknown as Logger;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the captured logs
|
|
||||||
*/
|
|
||||||
getCapturedLogs: () => [...capturedLogs],
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Clear captured logs
|
|
||||||
*/
|
|
||||||
clearCapturedLogs: () => {
|
|
||||||
capturedLogs = [];
|
|
||||||
},
|
|
||||||
/**
|
/**
|
||||||
* Mock Loki transport
|
* Mock Loki transport
|
||||||
*/
|
*/
|
||||||
|
|
@ -156,7 +179,7 @@ beforeAll(() => {
|
||||||
|
|
||||||
// Clean up after each test
|
// Clean up after each test
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
loggerTestHelpers.clearCapturedLogs();
|
// loggerTestHelpers.clearCapturedLogs(); // REMOVE this if it targeted a global array
|
||||||
});
|
});
|
||||||
|
|
||||||
// Restore everything after tests
|
// Restore everything after tests
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue