easy-config-logger
Version:
easy-config-logger is the logger with easy configuration. It is designed for both readability in development and json output in production.
221 lines (172 loc) • 8 kB
text/typescript
/**
* Logger Spec
*/
import * as stdMocks from 'std-mocks';
import { expect } from 'chai';
import { Logger } from './logger';
import { IOption, IMeta } from './interfaces';
describe('logger', () => {
const message: string = 'test message';
const colorizedDebug: string = '\u001b[34mdebug\u001b[39m:';
const colorizedInfo: string = '\u001b[36minfo\u001b[39m:';
const colorizedWarn: string = '\u001b[33mwarn\u001b[39m:';
const colorizeError: string = '\u001b[31merror\u001b[39m:';
const colorizedTest: string = '\u001b[36mtest\u001b[39m:';
describe('Constructor', () => {
it('should return Logger instance', () => {
const options: IOption = { env: 'development', level: 'debug' };
const logger: Logger = new Logger(options);
expect(logger).is.instanceof(Logger);
});
describe('options.level', () => {
it('should print log when options.level is under log level', () => {
const options: IOption = { env: 'development', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.debug(message);
stdMocks.restore();
const resultMessage: string = `${new Date().toISOString()} - ${colorizedDebug} ${message}\n`;
expect(stdMocks.flush().stderr[0]).to.equal(resultMessage);
});
it('should print log when options.level is over log level', () => {
const options: IOption = { env: 'development', level: 'info' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.debug(message);
stdMocks.restore();
expect(stdMocks.flush().stderr.length).to.equal(0);
});
it('should occur error when it receive unsupport level', () => {
const wrongLevel: string = 'wrong level';
const options: IOption = { env: 'development', level: wrongLevel };
const errMsg: string = `Log Level '${wrongLevel}' is not available`;
expect(() => new Logger(options)).to.throw().with.property('message', errMsg);
});
});
describe('options.env', () => {
it('should print log as pretty print when options.env is development', () => {
const options: IOption = { env: 'development', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.debug(message);
stdMocks.restore();
const resultMessage: string = `${new Date().toISOString()} - ${colorizedDebug} ${message}\n`;
expect(stdMocks.flush().stderr[0]).to.equal(resultMessage);
});
it('should print log as pretty print when options.env is test', () => {
const options: IOption = { env: 'test', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.debug(message);
stdMocks.restore();
const resultMessage: string = `${new Date().toISOString()} - ${colorizedDebug} ${message}\n`;
expect(stdMocks.flush().stderr[0]).to.equal(resultMessage);
});
it('should print log as json format when options.env is stage', () => {
const options: IOption = { env: 'stage', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.debug(message);
stdMocks.restore();
const result: object = { level: 'debug', message, timestamp: new Date() };
const resultMessage: string = `${JSON.stringify(result)}\n`;
expect(stdMocks.flush().stderr[0]).to.equal(resultMessage);
});
it('should print log as json format when options.env is production', () => {
const options: IOption = { env: 'production', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.debug(message);
stdMocks.restore();
const result: object = { level: 'debug', message, timestamp: new Date() };
const resultMessage: string = `${JSON.stringify(result)}\n`;
expect(stdMocks.flush().stderr[0]).to.equal(resultMessage);
});
it('should occur error when it receive unsupport env', () => {
const wrongEnv: string = 'wrong env';
const options: IOption = { env: wrongEnv, level: 'debug' };
const errMsg: string = `Environment '${wrongEnv}' is not available`;
expect(() => new Logger(options)).to.throw().with.property('message', errMsg);
});
});
describe('baseMeta', () => {
it('should be always appended meta', () => {
const options: IOption = { env: 'development', level: 'debug' };
const baseMeta: IMeta = { some_base_meta: 1 };
const logger: Logger = new Logger(options, baseMeta);
stdMocks.use();
logger.debug(message);
stdMocks.restore();
const metaResult: string = `{ some_base_meta: \u001b[33m${baseMeta.some_base_meta}\u001b[39m }\n`;
const resultMessage: string = `${new Date().toISOString()} - ${colorizedDebug} ${message} \n${metaResult}`;
expect(stdMocks.flush().stderr[0]).to.equal(resultMessage);
});
});
});
describe('.debug', () => {
it('should print log as \'debug\' level', () => {
const options: IOption = { env: 'development', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.debug(message);
stdMocks.restore();
const resultMessage: string = `${new Date().toISOString()} - ${colorizedDebug} ${message}\n`;
expect(stdMocks.flush().stderr[0]).to.equal(resultMessage);
});
it('should add meta that appended to log', () => {
const options: IOption = { env: 'development', level: 'debug' };
const meta: IMeta = { some_meta: 1 };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.debug(message, meta);
stdMocks.restore();
const metaResult: string = `{ some_meta: \u001b[33m${meta.some_meta}\u001b[39m }\n`;
const resultMessage: string = `${new Date().toISOString()} - ${colorizedDebug} ${message} \n${metaResult}`;
expect(stdMocks.flush().stderr[0]).to.equal(resultMessage);
});
});
describe('.info', () => {
it('should print log as \'info\' level', () => {
const options: IOption = { env: 'development', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.info(message);
stdMocks.restore();
const resultMessage: string = `${new Date().toISOString()} - ${colorizedInfo} ${message}\n`;
expect(stdMocks.flush().stdout[0]).to.equal(resultMessage);
});
});
describe('.warn', () => {
it('should print log as \'warn\' level', () => {
const options: IOption = { env: 'development', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.warn(message);
stdMocks.restore();
const resultMessage: string = `${new Date().toISOString()} - ${colorizedWarn} ${message}\n`;
expect(stdMocks.flush().stdout[0]).to.equal(resultMessage);
});
});
describe('.error', () => {
it('should print log as \'error\' level', () => {
const options: IOption = { env: 'development', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.error(message);
stdMocks.restore();
const resultMessage: string = `${new Date().toISOString()} - ${colorizeError} ${message}\n`;
expect(stdMocks.flush().stderr[0]).to.equal(resultMessage);
});
});
describe('.test', () => {
it('should print log as \'test\' level', () => {
const options: IOption = { env: 'development', level: 'debug' };
const logger: Logger = new Logger(options);
stdMocks.use();
logger.test(message);
stdMocks.restore();
const resultMessage: string = `${new Date().toISOString()} - ${colorizedTest} ${message}\n`;
expect(stdMocks.flush().stdout[0]).to.equal(resultMessage);
});
});
});