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
|
|
@ -5,7 +5,7 @@
|
|||
* 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';
|
||||
|
||||
// Store original console methods
|
||||
|
|
@ -17,43 +17,66 @@ const originalConsole = {
|
|||
debug: console.debug
|
||||
};
|
||||
|
||||
// Storage for captured logs
|
||||
let capturedLogs: any[] = [];
|
||||
|
||||
// Create a test logger helper
|
||||
export const loggerTestHelpers = { /**
|
||||
* Create a test logger instance that captures logs instead of outputting them
|
||||
*/ createTestLogger: (serviceName: string = 'test-service', context: any = {}) => {
|
||||
// Create a fully mocked Logger instance without using the real Logger class
|
||||
const logger = {
|
||||
serviceName,
|
||||
context,
|
||||
debug: (msg: string, metadata?: any) => capturedLogs.push({ level: 'debug', msg, service: serviceName, ...context, ...metadata }),
|
||||
info: (msg: string, metadata?: any) => capturedLogs.push({ level: 'info', msg, service: serviceName, ...context, ...metadata }),
|
||||
warn: (msg: string, metadata?: any) => capturedLogs.push({ level: 'warn', msg, service: serviceName, ...context, ...metadata }),
|
||||
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 }),
|
||||
verbose: (msg: string, metadata?: any) => capturedLogs.push({ level: 'verbose', msg, service: serviceName, ...context, ...metadata }),
|
||||
silly: (msg: string, metadata?: any) => capturedLogs.push({ level: 'silly', msg, service: serviceName, ...context, ...metadata }),
|
||||
child: (childContext: any) => {
|
||||
return loggerTestHelpers.createTestLogger(serviceName, { ...context, ...childContext });
|
||||
export const loggerTestHelpers = {
|
||||
/**
|
||||
* Create a test logger instance that captures logs locally.
|
||||
*/
|
||||
createTestLogger: (serviceName: string = 'test-service', initialContext: any = {}) => {
|
||||
const capturedLogsArray: any[] = [];
|
||||
|
||||
const createLoggerMockInstance = (currentContext: any): Logger => {
|
||||
const buildLogEntry = (level: string, messageOrObject: string | object, metadata?: any) => {
|
||||
const logObject: any = { level, service: serviceName, ...currentContext };
|
||||
|
||||
if (typeof messageOrObject === 'string') {
|
||||
logObject.msg = messageOrObject;
|
||||
if (metadata) {
|
||||
Object.assign(logObject, metadata);
|
||||
}
|
||||
} 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
|
||||
*/
|
||||
|
|
@ -156,7 +179,7 @@ beforeAll(() => {
|
|||
|
||||
// Clean up after each test
|
||||
afterEach(() => {
|
||||
loggerTestHelpers.clearCapturedLogs();
|
||||
// loggerTestHelpers.clearCapturedLogs(); // REMOVE this if it targeted a global array
|
||||
});
|
||||
|
||||
// Restore everything after tests
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue