@ibm-cloud/openapi-ruleset
Version:
Spectral ruleset for validating IBM Cloud services
172 lines (142 loc) • 6.34 kB
JavaScript
/**
* Copyright 2017 - 2024 IBM Corporation.
* SPDX-License-Identifier: Apache2.0
*/
const { LoggerFactory } = require('../../src/utils');
describe('LoggerFactory tests', () => {
let consoleSpy;
let loggerFactory;
const originalDebug = console.debug;
const originalInfo = console.info;
const originalWarn = console.warn;
const originalError = console.error;
beforeEach(() => {
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => {});
console.debug = console.log;
console.info = console.log;
console.warn = console.log;
console.error = console.log;
loggerFactory = new LoggerFactory();
});
afterEach(() => {
consoleSpy.mockRestore();
console.debug = originalDebug;
console.info = originalInfo;
console.warn = originalWarn;
console.error = originalError;
loggerFactory = null;
});
it('Root logger has default loglevel WARN', async () => {
const logger = loggerFactory.getLogger(null);
expect(logger.getLevel()).toBe(logger.levels.WARN);
});
it('addLoggerSetting() before root logger is created', async () => {
loggerFactory.addLoggerSetting('root', 'info');
const logger = loggerFactory.getLogger(null);
expect(logger.getLevel()).toBe(logger.levels.INFO);
});
it('addLoggerSetting() after root logger is created', async () => {
const logger = loggerFactory.getLogger(null);
loggerFactory.addLoggerSetting('root', 'info');
loggerFactory.applySettingsToAllLoggers();
expect(logger.getLevel()).toBe(logger.levels.INFO);
});
it('addLoggerSetting() before non-root logger is created', async () => {
loggerFactory.addLoggerSetting('ibm-*', 'debug');
const logger = loggerFactory.getLogger('ibm-rule1');
expect(logger.getLevel()).toBe(logger.levels.DEBUG);
});
it('addLoggerSetting() after non-root logger is created', async () => {
const logger = loggerFactory.getLogger('ibm-rule2');
loggerFactory.addLoggerSetting('ibm-*', 'error');
loggerFactory.applySettingsToAllLoggers();
expect(logger.getLevel()).toBe(logger.levels.ERROR);
});
it('addLoggerSetting() should throw exception for invalid level', async () => {
expect(() => {
loggerFactory.addLoggerSetting('ibm-*', 'BADLEVEL');
}).toThrow(/Invalid log level 'BADLEVEL'/);
});
it('Ensure level=error is honored', async () => {
loggerFactory.addLoggerSetting('rule-logger-error', 'error');
loggerFactory.applySettingsToAllLoggers();
const logger = loggerFactory.getLogger('rule-logger-error');
expect(logger.getLevel()).toBe(logger.levels.ERROR);
logger.debug('This debug message should not be displayed');
logger.info('This info message should not be displayed');
logger.warn('This warn message should not be displayed');
logger.error('This error message should be displayed');
const messages = captureMessages(consoleSpy.mock.calls);
// originalError(`captured messages:\n${messages}`);
expect(messages).toHaveLength(1);
expect(messages[0]).toContain('should be');
});
it('Ensure level=warn is honored', async () => {
loggerFactory.addLoggerSetting('rule-logger-warn', 'warn');
loggerFactory.applySettingsToAllLoggers();
const logger = loggerFactory.getLogger('rule-logger-warn');
expect(logger.getLevel()).toBe(logger.levels.WARN);
logger.debug('This debug message should not be displayed');
logger.info('This info message should not be displayed');
logger.warn('This warn message should be displayed');
logger.error('This error message should be displayed');
const messages = captureMessages(consoleSpy.mock.calls);
// originalError(`captured messages:\n${messages}`);
expect(messages).toHaveLength(2);
expect(messages[0]).toContain('should be');
expect(messages[1]).toContain('should be');
});
it('Ensure level=info is honored', async () => {
loggerFactory.addLoggerSetting('rule-logger-info', 'info');
loggerFactory.applySettingsToAllLoggers();
const logger = loggerFactory.getLogger('rule-logger-info');
expect(logger.getLevel()).toBe(logger.levels.INFO);
logger.debug('This debug message should not be displayed');
logger.info('This info message should be displayed');
logger.warn('This warn message should be displayed');
logger.error('This error message should be displayed');
const messages = captureMessages(consoleSpy.mock.calls);
// originalError(`captured messages:\n${messages}`);
expect(messages).toHaveLength(3);
expect(messages[0]).toContain('should be');
expect(messages[1]).toContain('should be');
expect(messages[2]).toContain('should be');
});
it('Ensure level=debug is honored', async () => {
loggerFactory.addLoggerSetting('rule-logger-debug', 'debug');
loggerFactory.applySettingsToAllLoggers();
const logger = loggerFactory.getLogger('rule-logger-debug');
expect(logger.getLevel()).toBe(logger.levels.DEBUG);
logger.debug('This debug message should be displayed');
logger.info('This info message should be displayed');
logger.warn('This warn message should be displayed');
logger.error('This error message should be displayed');
const messages = captureMessages(consoleSpy.mock.calls);
// originalError(`captured messages:\n${messages}`);
expect(messages).toHaveLength(4);
expect(messages[0]).toContain('should be');
expect(messages[1]).toContain('should be');
expect(messages[2]).toContain('should be');
expect(messages[3]).toContain('should be');
});
it('Ensure correct levels with root and non-root loggers', async () => {
loggerFactory.addLoggerSetting('root', 'debug');
loggerFactory.applySettingsToAllLoggers();
let logger = loggerFactory.getLogger('root');
expect(logger.getLevel()).toBe(logger.levels.DEBUG);
logger = loggerFactory.getLogger('my-rule');
expect(logger.getLevel()).toBe(logger.levels.WARN);
});
});
/**
* Returns a list consisting of the first argument within each "call" entry.
* We only use the first argument since we only pass one arg to each of the
* logger methods.
* @param {*} calls the list of calls made to the mock object
* @returns a list of messages logged
*/
function captureMessages(calls) {
return calls.map(args => {
return args[0];
});
}