lux-framework
Version:
Build scalable, Node.js-powered REST APIs with almost no code.
132 lines (109 loc) • 3.63 kB
JavaScript
// @flow
import { spy } from 'sinon';
import { expect } from 'chai';
import { it, describe, before, beforeEach, after } from 'mocha';
import { WARN, ERROR, LEVELS, FORMATS } from '../constants';
import { createWriter } from '../writer';
describe('module "logger/writer"', () => {
describe('#createWriter()', () => {
let stdoutSpy;
let stderrSpy;
before(() => {
stdoutSpy = spy(process.stdout, 'write');
stderrSpy = spy(process.stderr, 'write');
});
beforeEach(() => {
stdoutSpy.reset();
stderrSpy.reset();
});
after(() => {
stdoutSpy.restore();
stderrSpy.restore();
});
FORMATS.forEach(format => {
describe(`- format "${format}"`, () => {
let subject;
before(() => {
subject = createWriter(format);
});
LEVELS.forEach((num, level) => {
describe(`- level "${level}"`, () => {
it('can write message objects', () => {
const message = 'Hello world!';
const timestamp = new Date().toISOString();
let spyForLevel;
subject({
level,
message,
timestamp
});
switch (level) {
case WARN:
case ERROR:
spyForLevel = stderrSpy;
break;
default:
spyForLevel = stdoutSpy;
break;
}
expect(spyForLevel.calledOnce).to.be.true;
expect(spyForLevel)
.to.have.deep.property('firstCall.args[0]')
.and.include(message);
});
it('can write nested message objects', () => {
const message = { message: 'Hello world!' };
const timestamp = new Date().toISOString();
let spyForLevel;
subject({
level,
message,
timestamp
});
switch (level) {
case WARN:
case ERROR:
spyForLevel = stderrSpy;
break;
default:
spyForLevel = stdoutSpy;
break;
}
expect(spyForLevel).to.have.property('calledOnce', true);
if (format === 'text') {
expect(spyForLevel)
.to.have.deep.property('firstCall.args[0]')
.and.include(JSON.stringify(message, null, 2));
} else {
expect(spyForLevel)
.to.have.deep.property('firstCall.args[0]')
.and.include(message.message);
}
});
if (level === ERROR) {
it('can write error stack traces', () => {
const message = new Error('Test');
const timestamp = new Date().toISOString();
subject({
level,
message,
timestamp
});
expect(stderrSpy).to.have.property('calledOnce', true);
if (format === 'text') {
expect(stderrSpy)
.to.have.deep.property('firstCall.args[0]')
.and.include(message.stack);
} else {
expect(stderrSpy)
.to.have.deep.property('firstCall.args[0]')
.and.include(message.message);
}
});
}
});
});
});
});
});
});