Files
elasticsearch-js/test/unit/generic_logger_tests.js
2013-12-04 17:02:34 -06:00

250 lines
7.6 KiB
JavaScript

var Log = require('../../src/lib/log');
var LoggerAbstract = require('../../src/lib/logger');
var TracerLogger = require('../../src/lib/loggers/tracer');
var now = new Date('2013-03-01T00:00:00Z');
var sinon = require('sinon');
module.exports = function (makeLogger) {
var stub = require('./auto_release_stub').make();
var parent = new Log();
afterEach(function () {
parent.close();
});
describe('Constuctor', function () {
it('calls setupListeners, passes its new levels', function () {
var logger = makeLogger(parent);
stub(logger.constructor.prototype, 'setupListeners');
parent.close();
logger = makeLogger(parent);
logger.setupListeners.callCount.should.eql(1);
});
it('listens for the loggers\' "closing" event', function () {
var logger = makeLogger(parent);
parent.listenerCount('closing').should.eql(1);
});
});
describe('listening levels', function () {
it('calls cleanUpListeners when the listeners are being setup', function () {
var logger = makeLogger();
stub(logger, 'cleanUpListeners');
logger.setupListeners([]);
logger.cleanUpListeners.callCount.should.eql(1);
});
it('listens to just error when log is explicitly error', function () {
var logger = makeLogger(parent, 'error');
parent.listenerCount('error').should.eql(1);
parent.listenerCount('warning').should.eql(0);
parent.listenerCount('info').should.eql(0);
parent.listenerCount('debug').should.eql(0);
parent.listenerCount('trace').should.eql(0);
});
it('listens for all the events when level is "trace"', function () {
var logger = makeLogger(parent, 'trace');
parent.listenerCount('error').should.eql(1);
parent.listenerCount('warning').should.eql(1);
parent.listenerCount('info').should.eql(1);
parent.listenerCount('debug').should.eql(1);
parent.listenerCount('trace').should.eql(1);
});
it('listens for specific events when level is an array', function () {
var logger = makeLogger(parent, ['error', 'trace']);
parent.listenerCount('error').should.eql(1);
parent.listenerCount('warning').should.eql(0);
parent.listenerCount('info').should.eql(0);
parent.listenerCount('debug').should.eql(0);
parent.listenerCount('trace').should.eql(1);
});
it('sets the logLevel property to the new levels', function () {
var logger = makeLogger();
var levels = ['error'];
logger.setupListeners(levels);
logger.listeningLevels.should.eql(levels).and.not.be.exactly(levels);
levels = ['warning', 'trace'];
logger.setupListeners(levels);
logger.listeningLevels.should.eql(levels).and.not.be.exactly(levels);
levels = ['debug', 'debug'];
logger.setupListeners(levels);
logger.listeningLevels.should.eql(levels).and.not.be.exactly(levels);
});
it('rejects listening levels it can not listen to', function () {
var logger = makeLogger();
(function () {
logger.setupListeners(['scream']);
}).should.throw(/unable to listen/i);
});
it('emits events because something is listening', function () {
var logger = makeLogger(parent, 'trace');
stub(parent, 'emit');
parent.error(new Error('error message'));
parent.emit.lastCall.args[0].should.eql('error');
parent.warning('warning');
parent.emit.lastCall.args[0].should.eql('warning');
parent.info('info');
parent.emit.lastCall.args[0].should.eql('info');
parent.debug('debug');
parent.emit.lastCall.args[0].should.eql('debug');
parent.trace('GET', {}, '', '', 200);
parent.emit.lastCall.args[0].should.eql('trace');
});
});
describe('#timestamp', function () {
it('returns in the right format', function () {
stub.autoRelease(sinon.useFakeTimers(now.getTime()));
var logger = makeLogger();
logger.timestamp().should.eql('2013-03-01T00:00:00Z');
});
});
describe('#format', function () {
it('returns a single string with the message indented', function () {
stub.autoRelease(sinon.useFakeTimers(now.getTime()));
var logger = makeLogger();
logger.format('LABEL', 'MSG').should.eql(
'LABEL: 2013-03-01T00:00:00Z\n' +
' MSG\n' +
'\n'
);
});
it('properly indents multi-line messages', function () {
stub.autoRelease(sinon.useFakeTimers(now.getTime()));
var logger = makeLogger();
logger.format('LABEL', 'MSG\nwith\nseveral lines').should.eql(
'LABEL: 2013-03-01T00:00:00Z\n' +
' MSG\n' +
' with\n' +
' several lines\n' +
'\n'
);
});
});
describe('#onError', function () {
it('uses the Error name when it is not just "Error"', function () {
var logger = makeLogger();
stub(logger, 'write', function (label, msg) {
label.should.eql('TypeError');
});
logger.onError(new TypeError('Typerr'));
logger.write.callCount.should.eql(1);
});
it('uses "ERROR" when the error name is "Error"', function () {
var logger = makeLogger();
stub(logger, 'write', function (label, msg) {
label.should.eql('ERROR');
});
logger.onError(new Error('thing'));
logger.write.callCount.should.eql(1);
});
});
describe('#onWarning', function () {
it('uses the "WARNING" label', function () {
var logger = makeLogger();
stub(logger, 'write', function (label, msg) {
label.should.eql('WARNING');
});
logger.onWarning('message');
logger.write.callCount.should.eql(1);
});
it('echos the message', function () {
var logger = makeLogger();
stub(logger, 'write', function (label, msg) {
msg.should.eql('message');
});
logger.onWarning('message');
logger.write.callCount.should.eql(1);
});
});
describe('#onInfo', function () {
it('uses the "INFO" label', function () {
var logger = makeLogger();
stub(logger, 'write', function (label, msg) {
label.should.eql('INFO');
});
logger.onInfo('message');
logger.write.callCount.should.eql(1);
});
it('echos the message', function () {
var logger = makeLogger();
stub(logger, 'write', function (label, msg) {
msg.should.eql('message');
});
logger.onInfo('message');
logger.write.callCount.should.eql(1);
});
});
describe('#onDebug', function () {
it('uses the "DEBUG" label', function () {
var logger = makeLogger();
stub(logger, 'write', function (label, msg) {
label.should.eql('DEBUG');
});
logger.onDebug('message');
logger.write.callCount.should.eql(1);
});
it('echos the message', function () {
var logger = makeLogger();
stub(logger, 'write', function (label, msg) {
msg.should.eql('message');
});
logger.onDebug('message');
logger.write.callCount.should.eql(1);
});
});
describe('#onTrace', function () {
it('uses the "TRACE" label', function () {
var logger = makeLogger();
stub(logger, 'write', function (label, msg) {
label.should.eql('TRACE');
});
logger.onTrace('message');
logger.write.callCount.should.eql(1);
});
it('joins the message and curl call with a newline', function () {
var logger = makeLogger();
// tracer logger has custom trace logic...
if (!(logger instanceof TracerLogger)) {
stub(logger, 'write', function (label, msg) {
msg.should.eql('curlcall\nmessage');
});
logger.onTrace('message', 'curlcall');
logger.write.callCount.should.eql(1);
}
});
});
};