From c60d62960822bfa1017ac8cdd17ae5c8b0630765 Mon Sep 17 00:00:00 2001 From: Gareth Jones Date: Thu, 8 Aug 2013 08:56:09 +1000 Subject: [PATCH] added mocha, simplified logger by removing levels and making immutable --- lib/logger.js | 99 ++++++++++++++------------------------- package.json | 4 +- test/logger-test.js | 112 ++++++++++++++++++-------------------------- 3 files changed, 83 insertions(+), 132 deletions(-) diff --git a/lib/logger.js b/lib/logger.js index 5a1f81b..7f85956 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -1,80 +1,49 @@ "use strict"; var debug = require('./debug')('logger') -, levels = require('./levels') -, util = require('util') -, DEFAULT_CATEGORY = '[default]'; +, util = require('util'); + +module.exports = function Logger(dispatch, category) { + if (typeof dispatch !== 'function') { + throw new Error("Logger must have a dispatch delegate."); + } + + if (!category) { + throw new Error("Logger must have a category."); + } + + function log() { + var args = Array.prototype.slice.call(arguments) + , logLevel = args.shift() + , loggingEvent = new LoggingEvent(category, logLevel, args); + debug("Logging event " + loggingEvent + " to dispatch = " + util.inspect(dispatch)); + dispatch(loggingEvent); + } + + var self = this; + ['trace','debug','info','warn','error','fatal'].forEach( + function(level) { + self[level] = function() { + var args = Array.prototype.slice.call(arguments); + args.unshift(level); + log.apply(this, args); + }; + } + ); + +}; /** * Models a logging event. * @constructor - * @param {String} categoryName name of category + * @param {String} category name of category * @param {Log4js.Level} level level of message * @param {Array} data objects to log * @author Seth Chisamore */ -function LoggingEvent (categoryName, level, data) { +function LoggingEvent (category, level, data) { this.startTime = new Date(); - this.categoryName = categoryName; + this.category = category; this.data = data; this.level = level; } -/** - * Logger to log messages. - * use {@see Log4js#getLogger(String)} to get an instance. - * @constructor - * @param name name of category to log to - * @author Stephan Strittmatter - */ -function Logger (name, level, dispatch) { - this.category = name || DEFAULT_CATEGORY; - - if (level) { - this.setLevel(level); - } - - this.dispatch = dispatch; -} -Logger.DEFAULT_CATEGORY = DEFAULT_CATEGORY; -Logger.prototype.level = levels.TRACE; - -Logger.prototype.setLevel = function(level) { - debug("setting level to " + level); - this.level = levels.toLevel(level, this.level || levels.TRACE); -}; - -Logger.prototype.removeLevel = function() { - delete this.level; -}; - -Logger.prototype.log = function() { - var args = Array.prototype.slice.call(arguments) - , logLevel = args.shift() - , loggingEvent = new LoggingEvent(this.category, logLevel, args); - debug("Logging event " + loggingEvent + " to dispatch = " + util.inspect(this.dispatch)); - this.dispatch(loggingEvent); -}; - -Logger.prototype.isLevelEnabled = function(otherLevel) { - return this.level.isLessThanOrEqualTo(otherLevel); -}; - -['Trace','Debug','Info','Warn','Error','Fatal'].forEach( - function(levelString) { - var level = levels.toLevel(levelString); - Logger.prototype['is'+levelString+'Enabled'] = function() { - return this.isLevelEnabled(level); - }; - - Logger.prototype[levelString.toLowerCase()] = function () { - if (this.isLevelEnabled(level)) { - var args = Array.prototype.slice.call(arguments); - args.unshift(level); - Logger.prototype.log.apply(this, args); - } - }; - } -); - -exports.LoggingEvent = LoggingEvent; -exports.Logger = Logger; diff --git a/package.json b/package.json index 418a541..68b7984 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,8 @@ "vows": "0.7.0", "sandboxed-module": "0.1.3", "hook.io": "0.8.10", - "underscore": "1.2.1" + "underscore": "1.2.1", + "mocha": "~1.12.0", + "should": "~1.2.2" } } diff --git a/test/logger-test.js b/test/logger-test.js index e47e8e4..832a8cd 100644 --- a/test/logger-test.js +++ b/test/logger-test.js @@ -1,72 +1,52 @@ "use strict"; -var vows = require('vows') -, assert = require('assert') -, levels = require('../lib/levels') -, Logger = require('../lib/logger').Logger -, log4js = require('../lib/log4js'); +var should = require('should') +, Logger = require('../lib/logger'); -vows.describe('../lib/logger').addBatch({ - 'constructor with no parameters': { - topic: new Logger(), - 'should use default category': function(logger) { - assert.equal(logger.category, Logger.DEFAULT_CATEGORY); - }, - 'should use TRACE log level': function(logger) { - assert.equal(logger.level, levels.TRACE); - } - }, +describe('../lib/logger', function() { + describe('Logger constructor', function() { + it('must be passed a dispatch delegate and a category', function() { + (function() { new Logger(); }).should.throw( + "Logger must have a dispatch delegate." + ); + (function() { new Logger(function() {}); }).should.throw( + "Logger must have a category." + ); + }); - 'constructor with category': { - topic: new Logger('cheese'), - 'should use category': function(logger) { - assert.equal(logger.category, 'cheese'); - }, - 'should use TRACE log level': function(logger) { - assert.equal(logger.level, levels.TRACE); - } - }, + }); - 'constructor with category and level': { - topic: new Logger('cheese', 'debug'), - 'should use category': function(logger) { - assert.equal(logger.category, 'cheese'); - }, - 'should use level': function(logger) { - assert.equal(logger.level, levels.DEBUG); - } - }, + describe('Logger instance', function() { + var event + , logger = new Logger( + function(evt) { event = evt; }, + "exciting category" + ); - 'isLevelEnabled': { - topic: new Logger('cheese', 'info'), - 'should provide a level enabled function for all levels': function(logger) { - assert.isFunction(logger.isTraceEnabled); - assert.isFunction(logger.isDebugEnabled); - assert.isFunction(logger.isInfoEnabled); - assert.isFunction(logger.isWarnEnabled); - assert.isFunction(logger.isErrorEnabled); - assert.isFunction(logger.isFatalEnabled); - }, - 'should return the right values': function(logger) { - assert.isFalse(logger.isTraceEnabled()); - assert.isFalse(logger.isDebugEnabled()); - assert.isTrue(logger.isInfoEnabled()); - assert.isTrue(logger.isWarnEnabled()); - assert.isTrue(logger.isErrorEnabled()); - assert.isTrue(logger.isFatalEnabled()); - } - }, + beforeEach(function() { + event = null; + }); + + it('should be immutable', function() { + logger.category = "rubbish"; + logger.debug("thing"); + + event.category.should.equal("exciting category"); + }); + + ['trace', 'debug', 'info', 'warn', 'error', 'fatal'].forEach(function(level) { + it('should have a ' + level + ' function', function() { + logger[level].should.be.a('function'); + }); + }); + + it('should send log events to the dispatch delegate', function() { + logger.debug("interesting thing"); + event.should.have.property('category').equal('exciting category'); + event.should.have.property('level').equal('debug'); + event.should.have.property('data').eql(["interesting thing"]); + event.should.have.property('startTime'); + }); + }); + +}); - 'log': { - topic: function() { - var evt - , logger = new Logger('testing', null, function(event) { evt = event; }); - logger.log(levels.DEBUG, "cheese"); - return evt; - }, - 'should send log events to log4js': function(evt) { - assert.equal(evt.categoryName, 'testing'); - assert.equal(evt.level, levels.DEBUG); - assert.equal(evt.data[0], "cheese"); - } - } -}).exportTo(module);