From 1ab62194d08f8b95091500c3553cd14eb0c2f44d Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Mon, 25 Apr 2016 14:48:53 -0400 Subject: [PATCH 01/11] beautify + whitespace hipchat appender --- lib/appenders/hipchat.js | 58 +++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index 6f47f81..7e6af86 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -7,48 +7,50 @@ var hipchat, config; //hipchat has more limited colors var colours = { - ALL: "grey", - TRACE: "purple", - DEBUG: "purple", - INFO: "green", - WARN: "yellow", - ERROR: "red", - FATAL: "red", - OFF: "grey" + ALL: "grey", + TRACE: "purple", + DEBUG: "purple", + INFO: "green", + WARN: "yellow", + ERROR: "red", + FATAL: "red", + OFF: "grey" }; function hipchatAppender(_config, _layout) { - layout = _layout || layouts.basicLayout; + layout = _layout || layouts.basicLayout; - return function (loggingEvent) { + return function(loggingEvent) { - var data = { - room_id: _config.room_id, - from: _config.from, - message: layout(loggingEvent, _config.timezoneOffset), - format: _config.format, - color: colours[loggingEvent.level.toString()], - notify: _config.notify - }; - - hipchat.api.rooms.message(data, function (err, res) { - if (err) { throw err; } - }); + var data = { + room_id: _config.room_id, + from: _config.from, + message: layout(loggingEvent, _config.timezoneOffset), + format: _config.format, + color: colours[loggingEvent.level.toString()], + notify: _config.notify }; + + hipchat.api.rooms.message(data, function(err, res) { + if (err) { + throw err; + } + }); + }; } function configure(_config) { - if (_config.layout) { - layout = layouts.layout(_config.layout.type, _config.layout); - } + if (_config.layout) { + layout = layouts.layout(_config.layout.type, _config.layout); + } - hipchat = new HipChatClient(_config.api_key); + hipchat = new HipChatClient(_config.api_key); - return hipchatAppender(_config, layout); + return hipchatAppender(_config, layout); } -exports.name = 'hipchat'; +exports.name = 'hipchat'; exports.appender = hipchatAppender; exports.configure = configure; From b5a66afb2e955194a30356b685341930120b16ed Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Mon, 25 Apr 2016 15:07:46 -0400 Subject: [PATCH 02/11] do not share state between hipchat appenders --- lib/appenders/hipchat.js | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index 7e6af86..07008c2 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -1,9 +1,10 @@ "use strict"; var HipChatClient = require('hipchat-client'); var layouts = require('../layouts'); -var layout; -var hipchat, config; +exports.name = 'hipchat'; +exports.appender = hipchatAppender; +exports.configure = hipchatConfigure; //hipchat has more limited colors var colours = { @@ -17,9 +18,10 @@ var colours = { OFF: "grey" }; -function hipchatAppender(_config, _layout) { +function hipchatAppender(config, layout) { - layout = _layout || layouts.basicLayout; + var client = new HipChatClient(_config.api_key); + layout = layout || layouts.basicLayout; return function(loggingEvent) { @@ -32,25 +34,18 @@ function hipchatAppender(_config, _layout) { notify: _config.notify }; - hipchat.api.rooms.message(data, function(err, res) { + client.api.rooms.message(data, function(err, res) { if (err) { throw err; } }); - }; -} - -function configure(_config) { - - if (_config.layout) { - layout = layouts.layout(_config.layout.type, _config.layout); } - - hipchat = new HipChatClient(_config.api_key); - - return hipchatAppender(_config, layout); } -exports.name = 'hipchat'; -exports.appender = hipchatAppender; -exports.configure = configure; +function hipchatConfigure(config) { + var layout; + if (config.layout) { + layout = layouts.layout(config.layout.type, config.layout); + } + return hipchatAppender(config, layout); +} From 32070ca8e876a119b4cc1d6df1fef195ac4c6cb9 Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Mon, 25 Apr 2016 15:55:38 -0400 Subject: [PATCH 03/11] hipchat appender: use PassThroughLayout --- lib/appenders/hipchat.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index 07008c2..95ad7c8 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -20,8 +20,9 @@ var colours = { function hipchatAppender(config, layout) { - var client = new HipChatClient(_config.api_key); - layout = layout || layouts.basicLayout; + var notifier = hipchat.make(config.hipchat_room, config.hipchat_token); + + layout = layout || layouts.messagePassThroughLayout; return function(loggingEvent) { From 4ab05a5cc96d329046ec9cb8d7f02b69b1c5a9f2 Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Mon, 25 Apr 2016 16:11:18 -0400 Subject: [PATCH 04/11] use hipchat-notifier lib for apiv2 support --- lib/appenders/hipchat.js | 80 +++++++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 25 deletions(-) diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index 95ad7c8..9a5e95c 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -1,22 +1,34 @@ "use strict"; -var HipChatClient = require('hipchat-client'); +var hipchat = require('hipchat-notifier'); var layouts = require('../layouts'); exports.name = 'hipchat'; exports.appender = hipchatAppender; exports.configure = hipchatConfigure; -//hipchat has more limited colors -var colours = { - ALL: "grey", - TRACE: "purple", - DEBUG: "purple", - INFO: "green", - WARN: "yellow", - ERROR: "red", - FATAL: "red", - OFF: "grey" -}; +/** + @invoke as + log4js.configure({ + "appenders": [ + { + "type" : "hipchat", + "hipchat_token": "< User token with Notification Privileges >", + "hipchat_room": "< Room ID or Name >", + // optionl + "hipchat_from": "[ additional from label ]", + "hipchat_notify": "[ notify boolean to bug people ]", + "hipchat_host" : "api.hipchat.com" + } + ] + }); + @invoke + */ + +function hipchatNotifierResponseCallback(err, response, body){ + if(err) { + throw err; + } +} function hipchatAppender(config, layout) { @@ -26,20 +38,38 @@ function hipchatAppender(config, layout) { return function(loggingEvent) { - var data = { - room_id: _config.room_id, - from: _config.from, - message: layout(loggingEvent, _config.timezoneOffset), - format: _config.format, - color: colours[loggingEvent.level.toString()], - notify: _config.notify - }; + notifier.setRoom(config.hipchat_room); + notifier.setRoom(config.hipchat_room); + notifier.setFrom(config.hipchat_from || ''); + notifier.setNotify(config.hipchat_notify || false); - client.api.rooms.message(data, function(err, res) { - if (err) { - throw err; - } - }); + if(config.hipchat_host) { + notifier.setHost(config.hipchat_host); + } + + var notifierFn = "success"; + switch (loggingEvent.level.toString()) { + case "TRACE": + case "DEBUG": + notifierFn = "notice"; + break; + case "WARN": + notifierFn = "warning"; + break; + case "ERROR": + case "FATAL": + notifierFn = "failure"; + break; + default: + notifierFn = "info"; + } + + // @TODO, re-work in timezoneOffset ? + var layoutMessage = layout(loggingEvent); + + // dispatch hipchat api request, do not return anything + // [overide hipchatNotifierResponseCallback] + notifier[notifierFn](layoutMessage, hipchatNotifierResponseCallback); } } From 6131934f547bf2ff8075fa47d83cf7b64bd75e23 Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Mon, 25 Apr 2016 16:16:29 -0400 Subject: [PATCH 05/11] update hipchat-appender example --- examples/hipchat-appender.js | 22 ++++++++++++---------- lib/appenders/hipchat.js | 5 +++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/examples/hipchat-appender.js b/examples/hipchat-appender.js index 7b8b3db..c0e90e4 100644 --- a/examples/hipchat-appender.js +++ b/examples/hipchat-appender.js @@ -1,18 +1,20 @@ -//Note that hipchat appender needs hipchat-client to work. -//If you haven't got hipchat-client installed, you'll get cryptic -//"cannot find module" errors when using the hipchat appender + +/** + * !!! The hipchat-appender requires `hipchat-notifier` from npm + * - e.g. list as a dependency in your application's package.json + */ + var log4js = require('../lib/log4js'); log4js.configure({ "appenders": [ { "type" : "hipchat", - "api_key": 'Hipchat_API_V1_Key', - "room_id": "Room_ID", - "from": "Tester", - "format": "text", - "notify": "NOTIFY", - "category" : "hipchat" + "hipchat_token": "< User token with Notification Privileges >", + "hipchat_room": "< Room ID or Name >", + // optionl + "hipchat_from": "[ additional from label ]", + "hipchat_notify": "[ notify boolean to bug people ]" } ] }); @@ -25,4 +27,4 @@ logger.trace("Test Trace Message");//so debug and trace are the same color: purp logger.fatal("Test Fatal Message");//hipchat client has limited color scheme logger.error("Test Error Message");// fatal and error are same color: red logger.all("Test All message");//grey -//logger.debug("Test log message"); \ No newline at end of file +//logger.debug("Test log message"); diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index 9a5e95c..17afc65 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -8,6 +8,7 @@ exports.configure = hipchatConfigure; /** @invoke as + log4js.configure({ "appenders": [ { @@ -21,6 +22,10 @@ exports.configure = hipchatConfigure; } ] }); + + var logger = log4js.getLogger("hipchat"); + logger.warn("Test Warn message"); + @invoke */ From a8eecdb030871f47408941b525e60a7a1acd52fd Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Mon, 25 Apr 2016 16:25:20 -0400 Subject: [PATCH 06/11] hipchat-appender: configurable response callback --- lib/appenders/hipchat.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index 17afc65..27c0828 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -8,7 +8,7 @@ exports.configure = hipchatConfigure; /** @invoke as - + log4js.configure({ "appenders": [ { @@ -41,7 +41,8 @@ function hipchatAppender(config, layout) { layout = layout || layouts.messagePassThroughLayout; - return function(loggingEvent) { + // @lint W074 This function's cyclomatic complexity is too high. (10) + return function(loggingEvent){ notifier.setRoom(config.hipchat_room); notifier.setRoom(config.hipchat_room); @@ -74,8 +75,9 @@ function hipchatAppender(config, layout) { // dispatch hipchat api request, do not return anything // [overide hipchatNotifierResponseCallback] - notifier[notifierFn](layoutMessage, hipchatNotifierResponseCallback); - } + notifier[notifierFn](layoutMessage, config.hipchat_response_callback || + hipchatNotifierResponseCallback); + }; } function hipchatConfigure(config) { From 21623c7947c60d16a3a84a06964a0709b07a5ebc Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Mon, 25 Apr 2016 16:39:56 -0400 Subject: [PATCH 07/11] hipchat-appender: use previous color defaults --- examples/hipchat-appender.js | 8 +++++--- lib/appenders/hipchat.js | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/examples/hipchat-appender.js b/examples/hipchat-appender.js index c0e90e4..2def4bf 100644 --- a/examples/hipchat-appender.js +++ b/examples/hipchat-appender.js @@ -1,4 +1,3 @@ - /** * !!! The hipchat-appender requires `hipchat-notifier` from npm * - e.g. list as a dependency in your application's package.json @@ -12,9 +11,12 @@ log4js.configure({ "type" : "hipchat", "hipchat_token": "< User token with Notification Privileges >", "hipchat_room": "< Room ID or Name >", - // optionl + // optional "hipchat_from": "[ additional from label ]", - "hipchat_notify": "[ notify boolean to bug people ]" + "hipchat_notify": "[ notify boolean to bug people ]", + "hipchat_response_callback": function(err, response, body){ + console.log("overridden log4js hipchat-appender response callback"); + } } ] }); diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index 27c0828..ae653a4 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -1,4 +1,5 @@ "use strict"; + var hipchat = require('hipchat-notifier'); var layouts = require('../layouts'); @@ -44,6 +45,8 @@ function hipchatAppender(config, layout) { // @lint W074 This function's cyclomatic complexity is too high. (10) return function(loggingEvent){ + var notifierFn; + notifier.setRoom(config.hipchat_room); notifier.setRoom(config.hipchat_room); notifier.setFrom(config.hipchat_from || ''); @@ -53,11 +56,10 @@ function hipchatAppender(config, layout) { notifier.setHost(config.hipchat_host); } - var notifierFn = "success"; switch (loggingEvent.level.toString()) { case "TRACE": case "DEBUG": - notifierFn = "notice"; + notifierFn = "info"; break; case "WARN": notifierFn = "warning"; @@ -67,7 +69,7 @@ function hipchatAppender(config, layout) { notifierFn = "failure"; break; default: - notifierFn = "info"; + notifierFn = "success"; } // @TODO, re-work in timezoneOffset ? From beeeac081049f8930f2e6baba016d8a4221d2081 Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Mon, 25 Apr 2016 17:41:18 -0400 Subject: [PATCH 08/11] hipchat-appender: allow custom layoutFn --- examples/hipchat-appender.js | 59 +++++++++++++++++++++++++----------- lib/appenders/hipchat.js | 15 +++++---- 2 files changed, 50 insertions(+), 24 deletions(-) diff --git a/examples/hipchat-appender.js b/examples/hipchat-appender.js index 2def4bf..89cb7e5 100644 --- a/examples/hipchat-appender.js +++ b/examples/hipchat-appender.js @@ -1,6 +1,7 @@ /** - * !!! The hipchat-appender requires `hipchat-notifier` from npm - * - e.g. list as a dependency in your application's package.json + * !!! The hipchat-appender requires `hipchat-notifier` from npm, e.g. + * - list as a dependency in your application's package.json || + * - npm install hipchat-notifier */ var log4js = require('../lib/log4js'); @@ -9,24 +10,46 @@ log4js.configure({ "appenders": [ { "type" : "hipchat", - "hipchat_token": "< User token with Notification Privileges >", - "hipchat_room": "< Room ID or Name >", - // optional - "hipchat_from": "[ additional from label ]", - "hipchat_notify": "[ notify boolean to bug people ]", - "hipchat_response_callback": function(err, response, body){ - console.log("overridden log4js hipchat-appender response callback"); - } + "hipchat_token": process.env.HIPCHAT_TOKEN || '< User token with Notification Privileges >', + "hipchat_room": process.env.HIPCHAT_ROOM || '< Room ID or Name >' } ] }); var logger = log4js.getLogger("hipchat"); -logger.warn("Test Warn message");//yello -logger.info("Test Info message");//green -logger.debug("Test Debug Message");//hipchat client has limited color scheme -logger.trace("Test Trace Message");//so debug and trace are the same color: purple -logger.fatal("Test Fatal Message");//hipchat client has limited color scheme -logger.error("Test Error Message");// fatal and error are same color: red -logger.all("Test All message");//grey -//logger.debug("Test log message"); +logger.warn("Test Warn message"); +logger.info("Test Info message"); +logger.debug("Test Debug Message"); +logger.trace("Test Trace Message"); +logger.fatal("Test Fatal Message"); +logger.error("Test Error Message"); + +// alternative configuration + +// use a custom layout function +// format: [TIMESTAMP][LEVEL][category] - [message] +var customLayout = require('../lib/layouts').basicLayout; + +log4js.configure({ + "appenders": [ + { + "type" : "hipchat", + "hipchat_token": process.env.HIPCHAT_TOKEN || '< User token with Notification Privileges >', + "hipchat_room": process.env.HIPCHAT_ROOM || '< Room ID or Name >', + "hipchat_from": "Mr. Semantics", + "hipchat_notify": false, + "hipchat_response_callback": function(err, response, body){ + if(err || response.statusCode > 300){ + throw new Error('hipchat-notifier failed'); + } + console.log('mr semantics callback success'); + }, + "layout": customLayout + } + ] +}); + +logger.info("Test from processed by customLayout"); + +// @TODO: implement configuration of send message to allow HipChat cards &c +// for now, can try to implement by returning object from custom layout diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index ae653a4..d0a9959 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -36,12 +36,10 @@ function hipchatNotifierResponseCallback(err, response, body){ } } -function hipchatAppender(config, layout) { +function hipchatAppender(config) { var notifier = hipchat.make(config.hipchat_room, config.hipchat_token); - layout = layout || layouts.messagePassThroughLayout; - // @lint W074 This function's cyclomatic complexity is too high. (10) return function(loggingEvent){ @@ -73,7 +71,7 @@ function hipchatAppender(config, layout) { } // @TODO, re-work in timezoneOffset ? - var layoutMessage = layout(loggingEvent); + var layoutMessage = config.layout(loggingEvent); // dispatch hipchat api request, do not return anything // [overide hipchatNotifierResponseCallback] @@ -84,8 +82,13 @@ function hipchatAppender(config, layout) { function hipchatConfigure(config) { var layout; - if (config.layout) { - layout = layouts.layout(config.layout.type, config.layout); + + if (!config.layout) { + config.layout = layouts.messagePassThroughLayout; } + + // @TODO: implement configuration of send message to allow HipChat cards &c + // for now, can try to implement by returning object from custom layout + return hipchatAppender(config, layout); } From 9a71781c05c021cce4e5a1f029d63d2888b0a54e Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Thu, 28 Apr 2016 17:44:59 -0500 Subject: [PATCH 09/11] hipchat-appender: remove redundancy --- lib/appenders/hipchat.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index d0a9959..e2108d9 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -45,7 +45,6 @@ function hipchatAppender(config) { var notifierFn; - notifier.setRoom(config.hipchat_room); notifier.setRoom(config.hipchat_room); notifier.setFrom(config.hipchat_from || ''); notifier.setNotify(config.hipchat_notify || false); From 10b730ef873a925ac97ce536eb820c377166a947 Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Fri, 10 Jun 2016 09:46:19 -0500 Subject: [PATCH 10/11] minor cleanups --- examples/hipchat-appender.js | 11 +++++------ lib/appenders/hipchat.js | 3 --- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/examples/hipchat-appender.js b/examples/hipchat-appender.js index 89cb7e5..1cdf674 100644 --- a/examples/hipchat-appender.js +++ b/examples/hipchat-appender.js @@ -24,9 +24,11 @@ logger.trace("Test Trace Message"); logger.fatal("Test Fatal Message"); logger.error("Test Error Message"); -// alternative configuration -// use a custom layout function +// alternative configuration demonstrating callback + custom layout +/////////////////////////////////////////////////////////////////// + +// use a custom layout function (in this case, the provided basicLayout) // format: [TIMESTAMP][LEVEL][category] - [message] var customLayout = require('../lib/layouts').basicLayout; @@ -49,7 +51,4 @@ log4js.configure({ ] }); -logger.info("Test from processed by customLayout"); - -// @TODO: implement configuration of send message to allow HipChat cards &c -// for now, can try to implement by returning object from custom layout +logger.info("Test customLayout from Mr. Semantics"); diff --git a/lib/appenders/hipchat.js b/lib/appenders/hipchat.js index e2108d9..3fd65df 100644 --- a/lib/appenders/hipchat.js +++ b/lib/appenders/hipchat.js @@ -86,8 +86,5 @@ function hipchatConfigure(config) { config.layout = layouts.messagePassThroughLayout; } - // @TODO: implement configuration of send message to allow HipChat cards &c - // for now, can try to implement by returning object from custom layout - return hipchatAppender(config, layout); } From af8dc5d9638fa659344bd02ec8f2b777156a18ab Mon Sep 17 00:00:00 2001 From: Brice Burgess Date: Fri, 10 Jun 2016 12:06:59 -0500 Subject: [PATCH 11/11] update hipchat appendender test for hipchat-notifier --- test/hipchatAppender-test.js | 267 +++++++++++++---------------------- 1 file changed, 99 insertions(+), 168 deletions(-) diff --git a/test/hipchatAppender-test.js b/test/hipchatAppender-test.js index b98674e..4769c3a 100644 --- a/test/hipchatAppender-test.js +++ b/test/hipchatAppender-test.js @@ -1,181 +1,112 @@ "use strict"; -var vows = require('vows'); -var assert = require('assert'); -var log4js = require('../lib/log4js'); -var sandbox = require('sandboxed-module'); +var vows = require('vows'), + assert = require('assert'), + log4js = require('../lib/log4js'), + sandbox = require('sandboxed-module'); function setupLogging(category, options) { - var msgs = []; + var lastRequest = {}; - var hipchatCredentials = { - api_key: options.api_key, - room_id: options.room_id, - from: options.from, - message: options.message, - format: options.format, - color: options.color, - notify: options.notify - }; - var fakeHipchat = (function (key) { - function constructor() { - return { - options: key, - api: { - rooms: { - message: function (data, callback) { - msgs.push(data); - callback(false, {status: "sent"}); - } - } - } - }; - } + var fakeRequest = function(args, level){ + lastRequest.notifier = this; + lastRequest.body = args[0]; + lastRequest.callback = args[1]; + lastRequest.level = level; + }; - return constructor(key); - }); + var fakeHipchatNotifier = { + 'make': function(room, token, from, host, notify){ + return { + 'room': room, + 'token': token, + 'from': from || '', + 'host': host || 'api.hipchat.com', + 'notify': notify || false, + 'setRoom': function(val){ this.room = val; }, + 'setFrom': function(val){ this.from = val; }, + 'setHost': function(val){ this.host = val; }, + 'setNotify': function(val){ this.notify = val; }, + 'info': function(){ fakeRequest.call(this, arguments, 'info'); }, + 'warning': function(){ fakeRequest.call(this, arguments, 'warning'); }, + 'failure': function(){ fakeRequest.call(this, arguments, 'failure'); }, + 'success': function(){ fakeRequest.call(this, arguments, 'success'); } + }; + } + }; - var fakeLayouts = { - layout: function (type, config) { - this.type = type; - this.config = config; - return log4js.layouts.messagePassThroughLayout; - }, - basicLayout: log4js.layouts.basicLayout, - coloredLayout: log4js.layouts.coloredLayout, - messagePassThroughLayout: log4js.layouts.messagePassThroughLayout - }; + var hipchatModule = sandbox.require('../lib/appenders/hipchat', { + requires: { + 'hipchat-notifier': fakeHipchatNotifier + } + }); + log4js.clearAppenders(); + log4js.addAppender(hipchatModule.configure(options), category); - var fakeConsole = { - errors: [], - logs: [], - error: function (msg, value) { - this.errors.push({msg: msg, value: value}); - }, - log: function (msg, value) { - this.logs.push({msg: msg, value: value}); - } - }; - - - var hipchatModule = sandbox.require('../lib/appenders/hipchat', { - requires: { - 'hipchat-client': fakeHipchat, - '../layouts': fakeLayouts - }, - globals: { - console: fakeConsole - } - }); - - - log4js.addAppender(hipchatModule.configure(options), category); - - return { - logger: log4js.getLogger(category), - mailer: fakeHipchat, - layouts: fakeLayouts, - console: fakeConsole, - messages: msgs, - credentials: hipchatCredentials - }; + return { + logger: log4js.getLogger(category), + lastRequest: lastRequest + }; } -function checkMessages(result) { - for (var i = 0; i < result.messages.length; ++i) { - assert.equal(result.messages[i].from, 'FROM'); - assert.equal(result.messages[i].room_id, 'ROOMID'); - assert.ok(new RegExp('.+Log event #' + (i + 1)).test(result.messages[i].message)); +vows.describe('HipChat appender').addBatch({ + 'when logging to HipChat v2 API': { + topic: function() { + var customCallback = function(err, res, body){ return 'works'; }; + + var setup = setupLogging('myCategory', { + "type": "hipchat", + "hipchat_token": "User_Token_With_Notification_Privs", + "hipchat_room": "Room_ID_Or_Name", + "hipchat_from": "Log4js_Test", + "hipchat_notify": true, + "hipchat_host": "hipchat.your-company.tld", + "hipchat_response_callback": customCallback + }); + setup.logger.warn('Log event #1'); + return setup; + }, + 'a request to hipchat_host should be sent': function (topic) { + assert.equal(topic.lastRequest.notifier.host, "hipchat.your-company.tld"); + assert.equal(topic.lastRequest.notifier.notify, true); + assert.equal(topic.lastRequest.body, 'Log event #1'); + assert.equal(topic.lastRequest.level, 'warning'); + }, + 'a custom callback to the HipChat response is supported': function(topic) { + assert.equal(topic.lastRequest.callback(), 'works'); } -} - -log4js.clearAppenders(); - -vows.describe('log4js hipchatAppender').addBatch({ - 'hipchat setup': { - topic: setupLogging('hipchat setup', { - api_key: 'APIKEY', - room_id: "ROOMID", - from: "FROM", - message: "This is the message", - format: "FORMAT", - color: "This is the color", - notify: "NOTIFY" - }), - 'hipchat credentials should match': function (result) { - assert.equal(result.credentials.api_key, 'APIKEY'); - assert.equal(result.credentials.room_id, 'ROOMID'); - assert.equal(result.credentials.from, 'FROM'); - assert.equal(result.credentials.format, 'FORMAT'); - assert.equal(result.credentials.notify, 'NOTIFY'); - - } + }, + 'when missing options': { + topic: function() { + var setup = setupLogging('myLogger', { + "type": "hipchat", + }); + setup.logger.error('Log event #2'); + return setup; }, - - 'basic usage': { - topic: function () { - var setup = setupLogging('basic usage', { - api_key: 'APIKEY', - room_id: "ROOMID", - from: "FROM", - message: "This is the message", - format: "FORMAT", - color: "This is the color", - notify: "NOTIFY" - }); - - setup.logger.info("Log event #1"); - return setup; - }, - 'there should be one message only': function (result) { - assert.equal(result.messages.length, 1); - }, - 'message should contain proper data': function (result) { - checkMessages(result); - } - }, - 'config with layout': { - topic: function () { - var setup = setupLogging('config with layout', { - layout: { - type: "tester" - } - }); - return setup; - }, - 'should configure layout': function (result) { - assert.equal(result.layouts.type, 'tester'); - } - }, - 'separate notification for each event': { - topic: function () { - var self = this; - var setup = setupLogging('separate notification for each event', { - api_key: 'APIKEY', - room_id: "ROOMID", - from: "FROM", - message: "This is the message", - format: "FORMAT", - color: "This is the color", - notify: "NOTIFY" - }); - setTimeout(function () { - setup.logger.info('Log event #1'); - }, 0); - setTimeout(function () { - setup.logger.info('Log event #2'); - }, 500); - setTimeout(function () { - setup.logger.info('Log event #3'); - }, 1100); - setTimeout(function () { - self.callback(null, setup); - }, 3000); - }, - 'there should be three messages': function (result) { - assert.equal(result.messages.length, 3); - }, - 'messages should contain proper data': function (result) { - checkMessages(result); - } + 'it sets some defaults': function (topic) { + assert.equal(topic.lastRequest.notifier.host, "api.hipchat.com"); + assert.equal(topic.lastRequest.notifier.notify, false); + assert.equal(topic.lastRequest.body, 'Log event #2'); + assert.equal(topic.lastRequest.level, 'failure'); } + }, + 'when basicLayout is provided': { + topic: function() { + var setup = setupLogging('myLogger', { + "type": "hipchat", + "layout": log4js.layouts.basicLayout + }); + setup.logger.debug('Log event #3'); + return setup; + }, + 'it should include the timestamp': function (topic) { + + // basicLayout adds [TIMESTAMP] [LEVEL] category - message + // e.g. [2016-06-10 11:50:53.819] [DEBUG] myLogger - Log event #23 + + assert.match(topic.lastRequest.body, /^\[[^\]]+\] \[[^\]]+\].*Log event \#3$/); + assert.equal(topic.lastRequest.level, 'info'); + } + } + }).export(module);