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) {
11 createTransport: function (name, options) {
14 sendMail: function (msg, callback) {
25 layout: function (type, config) {
28 return log4js.layouts.messagePassThroughLayout;
30 basicLayout: log4js.layouts.basicLayout,
31 messagePassThroughLayout: log4js.layouts.messagePassThroughLayout
36 error: function (msg, value) {
37 this.errors.push({msg: msg, value: value});
41 var fakeTransportPlugin = function () {
44 var smtpModule = sandbox.require('../lib/appenders/smtp', {
46 'nodemailer': fakeMailer,
47 'nodemailer-sendmail-transport': fakeTransportPlugin,
48 'nodemailer-smtp-transport': fakeTransportPlugin,
49 '../layouts': fakeLayouts
56 log4js.addAppender(smtpModule.configure(options), category);
59 logger: log4js.getLogger(category),
67 function checkMessages(result, sender, subject) {
68 for (var i = 0; i < result.results.length; ++i) {
69 assert.equal(result.results[i].from, sender);
70 assert.equal(result.results[i].to, 'recipient@domain.com');
71 assert.equal(result.results[i].subject, subject ? subject : 'Log event #' + (i + 1));
72 assert.ok(new RegExp('.+Log event #' + (i + 1) + '\n$').test(result.results[i].text));
76 log4js.clearAppenders();
77 vows.describe('log4js smtpAppender').addBatch({
80 var setup = setupLogging('minimal config', {
81 recipients: 'recipient@domain.com',
85 user: 'user@domain.com'
89 setup.logger.info('Log event #1');
92 'there should be one message only': function (result) {
93 assert.equal(result.results.length, 1);
95 'message should contain proper data': function (result) {
96 checkMessages(result);
101 var setup = setupLogging('fancy config', {
102 recipients: 'recipient@domain.com',
103 sender: 'sender@domain.com',
104 subject: 'This is subject',
108 user: 'user@domain.com'
112 setup.logger.info('Log event #1');
115 'there should be one message only': function (result) {
116 assert.equal(result.results.length, 1);
118 'message should contain proper data': function (result) {
119 checkMessages(result, 'sender@domain.com', 'This is subject');
122 'config with layout': {
124 var setup = setupLogging('config with layout', {
131 'should configure layout': function (result) {
132 assert.equal(result.layouts.type, 'tester');
135 'separate email for each event': {
138 var setup = setupLogging('separate email for each event', {
139 recipients: 'recipient@domain.com',
143 user: 'user@domain.com'
147 setTimeout(function () {
148 setup.logger.info('Log event #1');
150 setTimeout(function () {
151 setup.logger.info('Log event #2');
153 setTimeout(function () {
154 setup.logger.info('Log event #3');
156 setTimeout(function () {
157 self.callback(null, setup);
160 'there should be three messages': function (result) {
161 assert.equal(result.results.length, 3);
163 'messages should contain proper data': function (result) {
164 checkMessages(result);
167 'multiple events in one email': {
170 var setup = setupLogging('multiple events in one email', {
171 recipients: 'recipient@domain.com',
176 user: 'user@domain.com'
180 setTimeout(function () {
181 setup.logger.info('Log event #1');
183 setTimeout(function () {
184 setup.logger.info('Log event #2');
186 setTimeout(function () {
187 setup.logger.info('Log event #3');
189 setTimeout(function () {
190 self.callback(null, setup);
193 'there should be two messages': function (result) {
194 assert.equal(result.results.length, 2);
196 'messages should contain proper data': function (result) {
197 assert.equal(result.results[0].to, 'recipient@domain.com');
198 assert.equal(result.results[0].subject, 'Log event #1');
200 result.results[0].text.match(new RegExp('.+Log event #[1-2]$', 'gm')).length,
203 assert.equal(result.results[1].to, 'recipient@domain.com');
204 assert.equal(result.results[1].subject, 'Log event #3');
205 assert.ok(new RegExp('.+Log event #3\n$').test(result.results[1].text));
208 'error when sending email': {
210 var setup = setupLogging('error when sending email', {
211 recipients: 'recipient@domain.com',
213 SMTP: {port: 25, auth: {user: 'user@domain.com'}}
216 setup.mailer.createTransport = function () {
218 sendMail: function (msg, cb) {
219 cb({message: "oh noes"});
226 setup.logger.info("This will break");
227 return setup.console;
229 'should be logged to console': function (cons) {
230 assert.equal(cons.errors.length, 1);
231 assert.equal(cons.errors[0].msg, "log4js.smtpAppender - Error happened");
232 assert.equal(cons.errors[0].value.message, 'oh noes');
235 'transport full config': {
237 var setup = setupLogging('transport full config', {
238 recipients: 'recipient@domain.com',
242 path: '/usr/sbin/sendmail'
246 setup.logger.info('Log event #1');
249 'there should be one message only': function (result) {
250 assert.equal(result.results.length, 1);
252 'message should contain proper data': function (result) {
253 checkMessages(result);
256 'transport no-options config': {
258 var setup = setupLogging('transport no-options config', {
259 recipients: 'recipient@domain.com',
264 setup.logger.info('Log event #1');
267 'there should be one message only': function (result) {
268 assert.equal(result.results.length, 1);
270 'message should contain proper data': function (result) {
271 checkMessages(result);
274 'transport no-plugin config': {
276 var setup = setupLogging('transport no-plugin config', {
277 recipients: 'recipient@domain.com',
281 setup.logger.info('Log event #1');
284 'there should be one message only': function (result) {
285 assert.equal(result.results.length, 1);
287 'message should contain proper data': function (result) {
288 checkMessages(result);
291 'attachment config': {
293 var setup = setupLogging('attachment config', {
294 recipients: 'recipient@domain.com',
301 user: 'user@domain.com'
305 setup.logger.info('Log event #1');
308 'message should contain proper data': function (result) {
309 assert.equal(result.results.length, 1);
310 assert.equal(result.results[0].attachments.length, 1);
311 var attachment = result.results[0].attachments[0];
312 assert.equal(result.results[0].text, "See logs as attachment");
313 assert.equal(attachment.filename, "default.log");
314 assert.equal(attachment.contentType, "text/x-log");
315 assert.ok(new RegExp('.+Log event #' + 1 + '\n$').test(attachment.content));