fix tests

This commit is contained in:
Matteo Pagliazzi
2020-02-29 17:40:46 +01:00
parent a5c4871183
commit 15e6cef7c4
2 changed files with 56 additions and 33 deletions

View File

@@ -1,14 +1,27 @@
import winston from 'winston'; import logger, { _loggerConfig } from '../../../../website/server/libs/logger';
import logger from '../../../../website/server/libs/logger';
import { import {
NotFound, NotFound,
} from '../../../../website/server/libs/errors'; } from '../../../../website/server/libs/errors';
describe.only('logger', () => { describe('logger', () => {
let logSpy; let infoSpy;
let warnSpy;
let errorSpy;
const originalLoggingEnabled = _loggerConfig.loggingEnabled;
before(() => { // enable logging in tests
_loggerConfig.loggingEnabled = true;
});
after(() => { // reset value of _loggerConfig.loggingEnabled
_loggerConfig.loggingEnabled = originalLoggingEnabled;
});
beforeEach(() => { beforeEach(() => {
logSpy = sandbox.stub(Object.getPrototypeOf(winston.createLogger()), 'log'); infoSpy = sandbox.stub(_loggerConfig.logger, 'info');
warnSpy = sandbox.stub(_loggerConfig.logger, 'warn');
errorSpy = sandbox.stub(_loggerConfig.logger, 'error');
}); });
afterEach(() => { afterEach(() => {
@@ -18,8 +31,8 @@ describe.only('logger', () => {
describe('info', () => { describe('info', () => {
it('calls winston\'s info log', () => { it('calls winston\'s info log', () => {
logger.info(1, 2, 3); logger.info(1, 2, 3);
expect(logSpy).to.be.calledOnce; expect(infoSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith('info', 1, 2, 3); expect(infoSpy).to.be.calledWith(1, 2, 3);
}); });
}); });
@@ -27,8 +40,8 @@ describe.only('logger', () => {
context('non-error object', () => { context('non-error object', () => {
it('passes through arguments if the first arg is not an error object', () => { it('passes through arguments if the first arg is not an error object', () => {
logger.error(1, 2, 3, 4); logger.error(1, 2, 3, 4);
expect(logSpy).to.be.calledOnce; expect(errorSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith('error', 1, 2, 3, 4); expect(errorSpy).to.be.calledWith(1, 2, 3, 4);
}); });
}); });
@@ -39,9 +52,8 @@ describe.only('logger', () => {
data: 1, data: 1,
}, 2, 3); }, 2, 3);
expect(logSpy).to.be.calledOnce; expect(errorSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith( expect(errorSpy).to.be.calledWith(
'error',
errInstance.stack, errInstance.stack,
{ data: 1, fullError: errInstance }, { data: 1, fullError: errInstance },
2, 2,
@@ -58,9 +70,8 @@ describe.only('logger', () => {
fullError: anotherError, fullError: anotherError,
}, 2, 3); }, 2, 3);
expect(logSpy).to.be.calledOnce; expect(errorSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith( expect(errorSpy).to.be.calledWith(
'error',
errInstance.stack, errInstance.stack,
{ data: 1, fullError: anotherError }, { data: 1, fullError: anotherError },
2, 2,
@@ -73,9 +84,8 @@ describe.only('logger', () => {
logger.error(errInstance, null, 2, 3); logger.error(errInstance, null, 2, 3);
expect(logSpy).to.be.calledOnce; expect(errorSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith( expect(errorSpy).to.be.calledWith(
'error',
errInstance.stack, errInstance.stack,
null, null,
2, 2,
@@ -88,9 +98,8 @@ describe.only('logger', () => {
logger.error(errInstance, true, 2, 3); logger.error(errInstance, true, 2, 3);
expect(logSpy).to.be.calledOnce; expect(errorSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith( expect(errorSpy).to.be.calledWith(
'error',
errInstance.stack, errInstance.stack,
true, true,
2, 2,
@@ -103,9 +112,8 @@ describe.only('logger', () => {
logger.error(errInstance, { httpCode: 400 }, 2, 3); logger.error(errInstance, { httpCode: 400 }, 2, 3);
expect(logSpy).to.be.calledOnce; expect(errorSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith( expect(errorSpy).to.be.calledWith(
'error',
errInstance.stack, errInstance.stack,
{ httpCode: 400, fullError: errInstance }, { httpCode: 400, fullError: errInstance },
2, 2,
@@ -121,9 +129,8 @@ describe.only('logger', () => {
httpCode: 502, httpCode: 502,
}, 2, 3); }, 2, 3);
expect(logSpy).to.be.calledOnce; expect(errorSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith( expect(errorSpy).to.be.calledWith(
'error',
errInstance.stack, errInstance.stack,
{ httpCode: 502, isHandledError: true, fullError: errInstance }, { httpCode: 502, isHandledError: true, fullError: errInstance },
2, 2,
@@ -139,9 +146,8 @@ describe.only('logger', () => {
httpCode: 403, httpCode: 403,
}, 2, 3); }, 2, 3);
expect(logSpy).to.be.calledOnce; expect(warnSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith( expect(warnSpy).to.be.calledWith(
'warn',
errInstance.stack, errInstance.stack,
{ httpCode: 403, isHandledError: true, fullError: errInstance }, { httpCode: 403, isHandledError: true, fullError: errInstance },
2, 2,
@@ -156,9 +162,8 @@ describe.only('logger', () => {
logger.error(errInstance, {}, 2, 3); logger.error(errInstance, {}, 2, 3);
expect(logSpy).to.be.calledOnce; expect(errorSpy).to.be.calledOnce;
expect(logSpy).to.be.calledWith( expect(errorSpy).to.be.calledWith(
'error',
errInstance.stack, errInstance.stack,
{ {
fullError: { fullError: {

View File

@@ -14,6 +14,13 @@ const ENABLE_LOGS_IN_PROD = nconf.get('ENABLE_CONSOLE_LOGS_IN_PROD') === 'true';
const logger = winston.createLogger(); const logger = winston.createLogger();
const _config = {
logger,
loggingEnabled: true, // false if no transport has been configured
};
export { _config as _loggerConfig }; // exported for use during tests
if (IS_PROD) { if (IS_PROD) {
if (ENABLE_LOGS_IN_PROD) { if (ENABLE_LOGS_IN_PROD) {
logger.add(new winston.transports.Console({ logger.add(new winston.transports.Console({
@@ -46,6 +53,12 @@ if (IS_PROD) {
.add(new winston.transports.Console({ .add(new winston.transports.Console({
level: 'warn', // warn and errors (json part) level: 'warn', // warn and errors (json part)
format: winston.format.combine( format: winston.format.combine(
// Remove stacktrace from json, printed separately
winston.format(info => {
const message = info.message.split('\n')[0];
info.message = message;
return info;
})(),
winston.format.prettyPrint({ winston.format.prettyPrint({
colorize: true, colorize: true,
}), }),
@@ -68,11 +81,15 @@ if (IS_PROD) {
winston.format.printf(info => `${info.timestamp} - ${info.level} ${info.message}`), winston.format.printf(info => `${info.timestamp} - ${info.level} ${info.message}`),
), ),
})); }));
} else {
_config.loggingEnabled = false;
} }
// exports a public interface insteaf of accessing directly the logger module // exports a public interface insteaf of accessing directly the logger module
const loggerInterface = { const loggerInterface = {
info (...args) { info (...args) {
if (!_config.loggingEnabled) return;
logger.info(...args); logger.info(...args);
}, },
@@ -81,6 +98,7 @@ const loggerInterface = {
// and an object of additional data to log alongside the error // and an object of additional data to log alongside the error
// If the first argument isn't an Error, it'll call logger.error with all the arguments supplied // If the first argument isn't an Error, it'll call logger.error with all the arguments supplied
error (...args) { error (...args) {
if (!_config.loggingEnabled) return;
const [err, errorData = {}, ...otherArgs] = args; const [err, errorData = {}, ...otherArgs] = args;
if (err instanceof Error) { if (err instanceof Error) {