2 var vows = require('vows');
3 var assert = require('assert');
4 var log4js = require('../lib/log4js');
5 var sandbox = require('sandboxed-module');
7 function setupLogging(category, options) {
10 var slackCredentials = {
12 channel_id: options.channel_id,
13 username: options.username,
14 format: options.format,
15 icon_url: options.icon_url
17 var fakeSlack = (function (key) {
18 function constructor() {
21 api: function (action, data, callback) {
23 callback(false, {status: "sent"});
28 return constructor(key);
32 layout: function (type, config) {
35 return log4js.layouts.messagePassThroughLayout;
37 basicLayout: log4js.layouts.basicLayout,
38 coloredLayout: log4js.layouts.coloredLayout,
39 messagePassThroughLayout: log4js.layouts.messagePassThroughLayout
45 error: function (msg, value) {
46 this.errors.push({msg: msg, value: value});
48 log: function (msg, value) {
49 this.logs.push({msg: msg, value: value});
54 var slackModule = sandbox.require('../lib/appenders/slack', {
56 'slack-node': fakeSlack,
57 '../layouts': fakeLayouts
65 log4js.addAppender(slackModule.configure(options), category);
68 logger: log4js.getLogger(category),
73 credentials: slackCredentials
77 function checkMessages(result) {
78 for (var i = 0; i < result.messages.length; ++i) {
79 assert.equal(result.messages[i].channel, '#CHANNEL');
80 assert.equal(result.messages[i].username, 'USERNAME');
81 assert.ok(new RegExp('.+Log event #' + (i + 1)).test(result.messages[i].text));
85 log4js.clearAppenders();
87 vows.describe('log4js slackAppender').addBatch({
89 topic: setupLogging('slack setup', {
91 channel_id: "#CHANNEL",
96 'slack credentials should match': function (result) {
97 assert.equal(result.credentials.token, 'TOKEN');
98 assert.equal(result.credentials.channel_id, '#CHANNEL');
99 assert.equal(result.credentials.username, 'USERNAME');
100 assert.equal(result.credentials.format, 'FORMAT');
101 assert.equal(result.credentials.icon_url, 'ICON_URL');
107 var setup = setupLogging('basic usage', {
109 channel_id: "#CHANNEL",
110 username: "USERNAME",
112 icon_url: "ICON_URL",
115 setup.logger.info("Log event #1");
118 'there should be one message only': function (result) {
119 assert.equal(result.messages.length, 1);
121 'message should contain proper data': function (result) {
122 checkMessages(result);
125 'config with layout': {
127 var setup = setupLogging('config with layout', {
134 'should configure layout': function (result) {
135 assert.equal(result.layouts.type, 'tester');
138 'separate notification for each event': {
141 var setup = setupLogging('separate notification for each event', {
143 channel_id: "#CHANNEL",
144 username: "USERNAME",
146 icon_url: "ICON_URL",
148 setTimeout(function () {
149 setup.logger.info('Log event #1');
151 setTimeout(function () {
152 setup.logger.info('Log event #2');
154 setTimeout(function () {
155 setup.logger.info('Log event #3');
157 setTimeout(function () {
158 self.callback(null, setup);
161 'there should be three messages': function (result) {
162 assert.equal(result.messages.length, 3);
164 'messages should contain proper data': function (result) {
165 checkMessages(result);