connect-logger-test.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /* jshint maxparams:7 */
  2. "use strict";
  3. var vows = require('vows')
  4. , assert = require('assert')
  5. , levels = require('../lib/levels');
  6. function MockLogger() {
  7. var that = this;
  8. this.messages = [];
  9. this.log = function(level, message, exception) {
  10. that.messages.push({ level: level, message: message });
  11. };
  12. this.isLevelEnabled = function(level) {
  13. return level.isGreaterThanOrEqualTo(that.level);
  14. };
  15. this.level = levels.TRACE;
  16. }
  17. function MockRequest(remoteAddr, method, originalUrl, headers) {
  18. this.socket = { remoteAddress: remoteAddr };
  19. this.originalUrl = originalUrl;
  20. this.method = method;
  21. this.httpVersionMajor = '5';
  22. this.httpVersionMinor = '0';
  23. this.headers = headers || {};
  24. var self = this;
  25. Object.keys(this.headers).forEach(function(key) {
  26. self.headers[key.toLowerCase()] = self.headers[key];
  27. });
  28. }
  29. function MockResponse() {
  30. this.end = function(chunk, encoding) {
  31. };
  32. this.writeHead = function(code, headers) {
  33. };
  34. }
  35. function request(cl, method, url, code, reqHeaders, resHeaders) {
  36. var req = new MockRequest('my.remote.addr', method, url, reqHeaders);
  37. var res = new MockResponse();
  38. cl(req, res, function() {});
  39. res.writeHead(code, resHeaders);
  40. res.end('chunk','encoding');
  41. }
  42. vows.describe('log4js connect logger').addBatch({
  43. 'getConnectLoggerModule': {
  44. topic: function() {
  45. var clm = require('../lib/connect-logger');
  46. return clm;
  47. },
  48. 'should return a "connect logger" factory' : function(clm) {
  49. assert.isObject(clm);
  50. },
  51. 'take a log4js logger and return a "connect logger"' : {
  52. topic: function(clm) {
  53. var ml = new MockLogger();
  54. var cl = clm.connectLogger(ml);
  55. return cl;
  56. },
  57. 'should return a "connect logger"': function(cl) {
  58. assert.isFunction(cl);
  59. }
  60. },
  61. 'log events' : {
  62. topic: function(clm) {
  63. var ml = new MockLogger();
  64. var cl = clm.connectLogger(ml);
  65. request(cl, 'GET', 'http://url', 200);
  66. return ml.messages;
  67. },
  68. 'check message': function(messages) {
  69. assert.isArray(messages);
  70. assert.equal(messages.length, 1);
  71. assert.ok(levels.INFO.isEqualTo(messages[0].level));
  72. assert.include(messages[0].message, 'GET');
  73. assert.include(messages[0].message, 'http://url');
  74. assert.include(messages[0].message, 'my.remote.addr');
  75. assert.include(messages[0].message, '200');
  76. }
  77. },
  78. 'log events with level below logging level' : {
  79. topic: function(clm) {
  80. var ml = new MockLogger();
  81. ml.level = levels.FATAL;
  82. var cl = clm.connectLogger(ml);
  83. request(cl, 'GET', 'http://url', 200);
  84. return ml.messages;
  85. },
  86. 'check message': function(messages) {
  87. assert.isArray(messages);
  88. assert.isEmpty(messages);
  89. }
  90. },
  91. 'log events with non-default level and custom format' : {
  92. topic: function(clm) {
  93. var ml = new MockLogger();
  94. ml.level = levels.INFO;
  95. var cl = clm.connectLogger(ml, { level: levels.INFO, format: ':method :url' } );
  96. request(cl, 'GET', 'http://url', 200);
  97. return ml.messages;
  98. },
  99. 'check message': function(messages) {
  100. assert.isArray(messages);
  101. assert.equal(messages.length, 1);
  102. assert.ok(levels.INFO.isEqualTo(messages[0].level));
  103. assert.equal(messages[0].message, 'GET http://url');
  104. }
  105. },
  106. 'logger with options as string': {
  107. topic: function(clm) {
  108. var ml = new MockLogger();
  109. ml.level = levels.INFO;
  110. var cl = clm.connectLogger(ml, ':method :url');
  111. request(cl, 'POST', 'http://meh', 200);
  112. return ml.messages;
  113. },
  114. 'should use the passed in format': function(messages) {
  115. assert.equal(messages[0].message, 'POST http://meh');
  116. }
  117. },
  118. 'auto log levels': {
  119. topic: function(clm) {
  120. var ml = new MockLogger();
  121. ml.level = levels.INFO;
  122. var cl = clm.connectLogger(ml, { level: 'auto', format: ':method :url' });
  123. request(cl, 'GET', 'http://meh', 200);
  124. request(cl, 'GET', 'http://meh', 201);
  125. request(cl, 'GET', 'http://meh', 302);
  126. request(cl, 'GET', 'http://meh', 404);
  127. request(cl, 'GET', 'http://meh', 500);
  128. return ml.messages;
  129. },
  130. 'should use INFO for 2xx': function(messages) {
  131. assert.ok(levels.INFO.isEqualTo(messages[0].level));
  132. assert.ok(levels.INFO.isEqualTo(messages[1].level));
  133. },
  134. 'should use WARN for 3xx': function(messages) {
  135. assert.ok(levels.WARN.isEqualTo(messages[2].level));
  136. },
  137. 'should use ERROR for 4xx': function(messages) {
  138. assert.ok(levels.ERROR.isEqualTo(messages[3].level));
  139. },
  140. 'should use ERROR for 5xx': function(messages) {
  141. assert.ok(levels.ERROR.isEqualTo(messages[4].level));
  142. }
  143. },
  144. 'format using a function': {
  145. topic: function(clm) {
  146. var ml = new MockLogger();
  147. ml.level = levels.INFO;
  148. var cl = clm.connectLogger(ml, function(req, res, formatFn) { return "I was called"; });
  149. request(cl, 'GET', 'http://blah', 200);
  150. return ml.messages;
  151. },
  152. 'should call the format function': function(messages) {
  153. assert.equal(messages[0].message, 'I was called');
  154. }
  155. },
  156. 'format that includes request headers': {
  157. topic: function(clm) {
  158. var ml = new MockLogger();
  159. ml.level = levels.INFO;
  160. var cl = clm.connectLogger(ml, ':req[Content-Type]');
  161. request(
  162. cl,
  163. 'GET', 'http://blah', 200,
  164. { 'Content-Type': 'application/json' }
  165. );
  166. return ml.messages;
  167. },
  168. 'should output the request header': function(messages) {
  169. assert.equal(messages[0].message, 'application/json');
  170. }
  171. },
  172. 'format that includes response headers': {
  173. topic: function(clm) {
  174. var ml = new MockLogger();
  175. ml.level = levels.INFO;
  176. var cl = clm.connectLogger(ml, ':res[Content-Type]');
  177. request(
  178. cl,
  179. 'GET', 'http://blah', 200,
  180. null,
  181. { 'Content-Type': 'application/cheese' }
  182. );
  183. return ml.messages;
  184. },
  185. 'should output the response header': function(messages) {
  186. assert.equal(messages[0].message, 'application/cheese');
  187. }
  188. }
  189. }
  190. }).export(module);