import type { GlobalConfig } from '@n8n/config'; import { mock } from 'jest-mock-extended'; import type { InstanceSettings } from 'n8n-core'; import { Logger } from '@/logging/logger.service'; describe('Logger', () => { describe('transports', () => { test('if `console` selected, should set console transport', () => { const globalConfig = mock({ logging: { level: 'info', outputs: ['console'], }, }); const logger = new Logger(globalConfig, mock()); const { transports } = logger.getInternalLogger(); expect(transports).toHaveLength(1); const [transport] = transports; expect(transport.constructor.name).toBe('Console'); }); test('if `file` selected, should set file transport', () => { const globalConfig = mock({ logging: { level: 'info', outputs: ['file'], file: { fileSizeMax: 100, fileCountMax: 16, location: 'logs/n8n.log', }, }, }); const logger = new Logger(globalConfig, mock({ n8nFolder: '/tmp' })); const { transports } = logger.getInternalLogger(); expect(transports).toHaveLength(1); const [transport] = transports; expect(transport.constructor.name).toBe('File'); }); }); describe('levels', () => { test('if `error` selected, should enable `error` level', () => { const globalConfig = mock({ logging: { level: 'error', outputs: ['console'], }, }); const logger = new Logger(globalConfig, mock()); const internalLogger = logger.getInternalLogger(); expect(internalLogger.isErrorEnabled()).toBe(true); expect(internalLogger.isWarnEnabled()).toBe(false); expect(internalLogger.isInfoEnabled()).toBe(false); expect(internalLogger.isDebugEnabled()).toBe(false); }); test('if `warn` selected, should enable `error` and `warn` levels', () => { const globalConfig = mock({ logging: { level: 'warn', outputs: ['console'], }, }); const logger = new Logger(globalConfig, mock()); const internalLogger = logger.getInternalLogger(); expect(internalLogger.isErrorEnabled()).toBe(true); expect(internalLogger.isWarnEnabled()).toBe(true); expect(internalLogger.isInfoEnabled()).toBe(false); expect(internalLogger.isDebugEnabled()).toBe(false); }); test('if `info` selected, should enable `error`, `warn`, and `info` levels', () => { const globalConfig = mock({ logging: { level: 'info', outputs: ['console'], }, }); const logger = new Logger(globalConfig, mock()); const internalLogger = logger.getInternalLogger(); expect(internalLogger.isErrorEnabled()).toBe(true); expect(internalLogger.isWarnEnabled()).toBe(true); expect(internalLogger.isInfoEnabled()).toBe(true); expect(internalLogger.isDebugEnabled()).toBe(false); }); test('if `debug` selected, should enable all levels', () => { const globalConfig = mock({ logging: { level: 'debug', outputs: ['console'], }, }); const logger = new Logger(globalConfig, mock()); const internalLogger = logger.getInternalLogger(); expect(internalLogger.isErrorEnabled()).toBe(true); expect(internalLogger.isWarnEnabled()).toBe(true); expect(internalLogger.isInfoEnabled()).toBe(true); expect(internalLogger.isDebugEnabled()).toBe(true); }); test('if `silent` selected, should disable all levels', () => { const globalConfig = mock({ logging: { level: 'silent', outputs: ['console'], }, }); const logger = new Logger(globalConfig, mock()); const internalLogger = logger.getInternalLogger(); expect(internalLogger.isErrorEnabled()).toBe(false); expect(internalLogger.isWarnEnabled()).toBe(false); expect(internalLogger.isInfoEnabled()).toBe(false); expect(internalLogger.isDebugEnabled()).toBe(false); expect(internalLogger.silent).toBe(true); }); }); });