smtpAppender-test.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. "use strict";
  2. var vows = require('vows')
  3. , assert = require('assert')
  4. , log4js = require('../lib/log4js')
  5. , sandbox = require('sandboxed-module')
  6. ;
  7. function setupLogging(category, options) {
  8. var msgs = [];
  9. var fakeMailer = {
  10. createTransport: function (name, options) {
  11. return {
  12. config: options,
  13. sendMail: function (msg, callback) {
  14. msgs.push(msg);
  15. callback(null, true);
  16. },
  17. close: function() {}
  18. };
  19. }
  20. };
  21. var fakeLayouts = {
  22. layout: function(type, config) {
  23. this.type = type;
  24. this.config = config;
  25. return log4js.layouts.messagePassThroughLayout;
  26. },
  27. basicLayout: log4js.layouts.basicLayout,
  28. messagePassThroughLayout: log4js.layouts.messagePassThroughLayout
  29. };
  30. var fakeConsole = {
  31. errors: [],
  32. error: function(msg, value) {
  33. this.errors.push({ msg: msg, value: value });
  34. }
  35. };
  36. var smtpModule = sandbox.require('../lib/appenders/smtp', {
  37. requires: {
  38. 'nodemailer': fakeMailer,
  39. '../layouts': fakeLayouts
  40. },
  41. globals: {
  42. console: fakeConsole
  43. }
  44. });
  45. log4js.addAppender(smtpModule.configure(options), category);
  46. return {
  47. logger: log4js.getLogger(category),
  48. mailer: fakeMailer,
  49. layouts: fakeLayouts,
  50. console: fakeConsole,
  51. results: msgs
  52. };
  53. }
  54. function checkMessages (result, sender, subject) {
  55. for (var i = 0; i < result.results.length; ++i) {
  56. assert.equal(result.results[i].from, sender);
  57. assert.equal(result.results[i].to, 'recipient@domain.com');
  58. assert.equal(result.results[i].subject, subject ? subject : 'Log event #' + (i+1));
  59. assert.ok(new RegExp('.+Log event #' + (i+1) + '\n$').test(result.results[i].text));
  60. }
  61. }
  62. log4js.clearAppenders();
  63. vows.describe('log4js smtpAppender').addBatch({
  64. 'minimal config': {
  65. topic: function() {
  66. var setup = setupLogging('minimal config', {
  67. recipients: 'recipient@domain.com',
  68. transport: "SMTP",
  69. SMTP: {
  70. port: 25,
  71. auth: {
  72. user: 'user@domain.com'
  73. }
  74. }
  75. });
  76. setup.logger.info('Log event #1');
  77. return setup;
  78. },
  79. 'there should be one message only': function (result) {
  80. assert.equal(result.results.length, 1);
  81. },
  82. 'message should contain proper data': function (result) {
  83. checkMessages(result);
  84. }
  85. },
  86. 'fancy config': {
  87. topic: function() {
  88. var setup = setupLogging('fancy config', {
  89. recipients: 'recipient@domain.com',
  90. sender: 'sender@domain.com',
  91. subject: 'This is subject',
  92. transport: "SMTP",
  93. SMTP: {
  94. port: 25,
  95. auth: {
  96. user: 'user@domain.com'
  97. }
  98. }
  99. });
  100. setup.logger.info('Log event #1');
  101. return setup;
  102. },
  103. 'there should be one message only': function (result) {
  104. assert.equal(result.results.length, 1);
  105. },
  106. 'message should contain proper data': function (result) {
  107. checkMessages(result, 'sender@domain.com', 'This is subject');
  108. }
  109. },
  110. 'config with layout': {
  111. topic: function() {
  112. var setup = setupLogging('config with layout', {
  113. layout: {
  114. type: "tester"
  115. }
  116. });
  117. return setup;
  118. },
  119. 'should configure layout': function(result) {
  120. assert.equal(result.layouts.type, 'tester');
  121. }
  122. },
  123. 'separate email for each event': {
  124. topic: function() {
  125. var self = this;
  126. var setup = setupLogging('separate email for each event', {
  127. recipients: 'recipient@domain.com',
  128. transport: "SMTP",
  129. SMTP: {
  130. port: 25,
  131. auth: {
  132. user: 'user@domain.com'
  133. }
  134. }
  135. });
  136. setTimeout(function () {
  137. setup.logger.info('Log event #1');
  138. }, 0);
  139. setTimeout(function () {
  140. setup.logger.info('Log event #2');
  141. }, 500);
  142. setTimeout(function () {
  143. setup.logger.info('Log event #3');
  144. }, 1050);
  145. setTimeout(function () {
  146. self.callback(null, setup);
  147. }, 2100);
  148. },
  149. 'there should be three messages': function (result) {
  150. assert.equal(result.results.length, 3);
  151. },
  152. 'messages should contain proper data': function (result) {
  153. checkMessages(result);
  154. }
  155. },
  156. 'multiple events in one email': {
  157. topic: function() {
  158. var self = this;
  159. var setup = setupLogging('multiple events in one email', {
  160. recipients: 'recipient@domain.com',
  161. sendInterval: 1,
  162. transport: "SMTP",
  163. SMTP: {
  164. port: 25,
  165. auth: {
  166. user: 'user@domain.com'
  167. }
  168. }
  169. });
  170. setTimeout(function () {
  171. setup.logger.info('Log event #1');
  172. }, 0);
  173. setTimeout(function () {
  174. setup.logger.info('Log event #2');
  175. }, 500);
  176. setTimeout(function () {
  177. setup.logger.info('Log event #3');
  178. }, 1050);
  179. setTimeout(function () {
  180. self.callback(null, setup);
  181. }, 2100);
  182. },
  183. 'there should be two messages': function (result) {
  184. assert.equal(result.results.length, 2);
  185. },
  186. 'messages should contain proper data': function (result) {
  187. assert.equal(result.results[0].to, 'recipient@domain.com');
  188. assert.equal(result.results[0].subject, 'Log event #1');
  189. assert.equal(result.results[0].text.match(new RegExp('.+Log event #[1-2]$', 'gm')).length, 2);
  190. assert.equal(result.results[1].to, 'recipient@domain.com');
  191. assert.equal(result.results[1].subject, 'Log event #3');
  192. assert.ok(new RegExp('.+Log event #3\n$').test(result.results[1].text));
  193. }
  194. },
  195. 'error when sending email': {
  196. topic: function() {
  197. var setup = setupLogging('error when sending email', {
  198. recipients: 'recipient@domain.com',
  199. sendInterval: 0,
  200. transport: 'SMTP',
  201. SMTP: { port: 25, auth: { user: 'user@domain.com' } }
  202. });
  203. setup.mailer.createTransport = function() {
  204. return {
  205. sendMail: function(msg, cb) {
  206. cb({ message: "oh noes" });
  207. },
  208. close: function() { }
  209. };
  210. };
  211. setup.logger.info("This will break");
  212. return setup.console;
  213. },
  214. 'should be logged to console': function(cons) {
  215. assert.equal(cons.errors.length, 1);
  216. assert.equal(cons.errors[0].msg, "log4js.smtpAppender - Error happened");
  217. assert.equal(cons.errors[0].value.message, 'oh noes');
  218. }
  219. }
  220. }).export(module);