UNPKG

ts-tiny-logger

Version:

A lightweight TypeScript logger package with Flyweight pattern

160 lines (159 loc) 7.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const logger_1 = require("../logger"); describe('Logger', () => { beforeEach(() => { // Clear all instances between tests // @ts-ignore - Private static field access for testing logger_1.Logger.instances = new Map(); }); describe('getInstance', () => { it('should create a new logger instance', () => { const logger = logger_1.Logger.getInstance('test'); expect(logger).toBeInstanceOf(logger_1.Logger); }); it('should return the same instance for the same identifier', () => { const logger1 = logger_1.Logger.getInstance('test'); const logger2 = logger_1.Logger.getInstance('test'); expect(logger1).toBe(logger2); }); it('should create different instances for different identifiers', () => { const logger1 = logger_1.Logger.getInstance('test1'); const logger2 = logger_1.Logger.getInstance('test2'); expect(logger1).not.toBe(logger2); }); it('should create multiple instances with unique logs', () => { const logger1 = logger_1.Logger.getInstance('test1'); const logger2 = logger_1.Logger.getInstance('test2'); const logger3 = logger_1.Logger.getInstance('test3'); logger1.log('name1', 'value1'); logger2.log('name2', 'value2'); logger3.log('name3', 'value3'); expect(logger1.getLogs()).toHaveLength(1); expect(logger1.getLogs()[0].name).toBe('name1'); expect(logger2.getLogs()).toHaveLength(1); expect(logger2.getLogs()[0].name).toBe('name2'); expect(logger3.getLogs()).toHaveLength(1); expect(logger3.getLogs()[0].name).toBe('name3'); }); }); describe('log', () => { it('should add a log entry', () => { const logger = logger_1.Logger.getInstance('test'); logger.log('test-name', 'test-value'); const logs = logger.getLogs(); expect(logs).toHaveLength(1); expect(logs[0].name).toBe('test-name'); expect(logs[0].value).toBe('test-value'); expect(logs[0].dateTime).toMatch(/^\d{4}-\d{2}-\d{2}:\d{2}-\d{2}-\d{2}-\d{3}$/); }); it('should add multiple log entries', () => { const logger = logger_1.Logger.getInstance('test'); logger.log('name1', 'value1'); logger.log('name2', 'value2'); const logs = logger.getLogs(); expect(logs).toHaveLength(2); expect(logs[0].name).toBe('name1'); expect(logs[0].value).toBe('value1'); expect(logs[1].name).toBe('name2'); expect(logs[1].value).toBe('value2'); }); it('should handle empty string values', () => { const logger = logger_1.Logger.getInstance('test'); logger.log('', ''); const logs = logger.getLogs(); expect(logs).toHaveLength(1); expect(logs[0].name).toBe(''); expect(logs[0].value).toBe(''); }); it('should preserve order of log entries', () => { const logger = logger_1.Logger.getInstance('test'); for (let i = 0; i < 10; i++) { logger.log(`name${i}`, `value${i}`); } const logs = logger.getLogs(); expect(logs).toHaveLength(10); for (let i = 0; i < 10; i++) { expect(logs[i].name).toBe(`name${i}`); expect(logs[i].value).toBe(`value${i}`); } }); }); describe('getLogs', () => { it('should return a copy of logs array', () => { const logger = logger_1.Logger.getInstance('test'); logger.log('test', 'value'); const logs1 = logger.getLogs(); const logs2 = logger.getLogs(); expect(logs1).toEqual(logs2); expect(logs1).not.toBe(logs2); // Different array reference }); it('should return empty array when no logs', () => { const logger = logger_1.Logger.getInstance('test'); const logs = logger.getLogs(); expect(logs).toEqual([]); }); it('should not allow modifying original logs via returned array', () => { const logger = logger_1.Logger.getInstance('test'); logger.log('test', 'value'); const logs = logger.getLogs(); logs.push({ dateTime: 'fake', name: 'fake', value: 'fake' }); expect(logger.getLogs()).toHaveLength(1); }); }); describe('clearLogs', () => { it('should clear all logs', () => { const logger = logger_1.Logger.getInstance('test'); logger.log('test', 'value'); expect(logger.getLogs()).toHaveLength(1); logger.clearLogs(); expect(logger.getLogs()).toHaveLength(0); }); it('should not affect other logger instances', () => { const logger1 = logger_1.Logger.getInstance('test1'); const logger2 = logger_1.Logger.getInstance('test2'); logger1.log('test1', 'value1'); logger2.log('test2', 'value2'); logger1.clearLogs(); expect(logger1.getLogs()).toHaveLength(0); expect(logger2.getLogs()).toHaveLength(1); }); it('should allow adding new logs after clearing', () => { const logger = logger_1.Logger.getInstance('test'); logger.log('before', 'clear'); logger.clearLogs(); logger.log('after', 'clear'); const logs = logger.getLogs(); expect(logs).toHaveLength(1); expect(logs[0].name).toBe('after'); expect(logs[0].value).toBe('clear'); }); }); describe('formatDateTime', () => { it('should format date correctly', () => { const logger = logger_1.Logger.getInstance('test'); const date = new Date(2023, 0, 15, 10, 30, 45, 123); // 2023-01-15 10:30:45.123 // @ts-ignore - Private method access for testing const formatted = logger.formatDateTime(date); expect(formatted).toBe('2023-01-15:10-30-45-123'); }); it('should pad values with leading zeros', () => { const logger = logger_1.Logger.getInstance('test'); const date = new Date(2023, 0, 1, 1, 5, 9, 7); // 2023-01-01 01:05:09.007 // @ts-ignore - Private method access for testing const formatted = logger.formatDateTime(date); expect(formatted).toBe('2023-01-01:01-05-09-007'); }); it('should handle different months correctly', () => { const logger = logger_1.Logger.getInstance('test'); // Test each month (0-based index in JavaScript Date) for (let month = 0; month < 12; month++) { const date = new Date(2023, month, 1, 12, 0, 30, 0); // @ts-ignore - Private method access for testing const formatted = logger.formatDateTime(date); const expectedMonth = String(month + 1).padStart(2, '0'); expect(formatted).toBe(`2023-${expectedMonth}-01:12-00-30-000`); } }); }); });