Update version to 0.0.16, add Appender and AppenderFactory classes, refactor LoggerFactory methods, and implement logging functionality with tests.

This commit is contained in:
2025-10-04 09:20:27 -04:00
parent ea8fd991a0
commit 07485bd0c3
14 changed files with 789 additions and 15 deletions

View File

@@ -0,0 +1,94 @@
import { describe, it, expect, beforeEach, vi } from 'bun:test';
import LoggerFactory from '../src/LoggerFactory';
import { LoggingLevel } from '../src/level/LoggingLevel';
import type IAppender from '../src/appenders/IAppender';
describe('LoggerFactory', () => {
let mockAppender: IAppender;
beforeEach(() => {
// Reset LoggerFactory state between tests
// Note: This is tricky since LoggerFactory uses static state
// In a real scenario, we'd need to refactor for better testability
mockAppender = {
log: vi.fn(),
};
});
describe('getLogger', () => {
it('should return a logger instance', () => {
const logger = LoggerFactory.getLogger('test-category');
expect(logger).toBeDefined();
expect(typeof logger.info).toBe('function');
expect(typeof logger.warn).toBe('function');
expect(typeof logger.error).toBe('function');
expect(typeof logger.debug).toBe('function');
});
it('should return the same logger instance for the same category', () => {
const logger1 = LoggerFactory.getLogger('test-category');
const logger2 = LoggerFactory.getLogger('test-category');
expect(logger1).toBe(logger2);
});
it('should return different logger instances for different categories', () => {
const logger1 = LoggerFactory.getLogger('category1');
const logger2 = LoggerFactory.getLogger('category2');
expect(logger1).not.toBe(logger2);
});
});
describe('setLoggingLevel', () => {
it('should change the logging threshold', () => {
LoggerFactory.setLoggingLevel('Debug');
// Create a logger and check that debug messages are logged
const logger = LoggerFactory.getLogger('test');
logger.debug('debug message');
// Note: We can't easily test this without mocking the appenders
// This would require refactoring LoggerFactory for better testability
});
});
describe('applyAppender', () => {
it('should return a disposable', () => {
const disposable = LoggerFactory.applyAppender(mockAppender);
expect(disposable).toBeDefined();
expect(typeof disposable.dispose).toBe('function');
});
it('should add appender to all loggers', () => {
const disposable = LoggerFactory.applyAppender(mockAppender);
const logger = LoggerFactory.getLogger('test');
logger.info('test message');
expect(mockAppender.log).toHaveBeenCalled();
// Clean up
disposable.dispose();
});
it('should remove appender when disposed', () => {
const disposable = LoggerFactory.applyAppender(mockAppender);
const logger = LoggerFactory.getLogger('test');
logger.info('test message');
expect(mockAppender.log).toHaveBeenCalledTimes(1);
// Dispose and try again
disposable.dispose();
logger.info('test message 2');
// Should still be called once since we disposed the mock appender
// but the default appenders are still there
expect(mockAppender.log).toHaveBeenCalledTimes(1);
});
});
});