UNPKG

@tlrg/middleware-js

Version:
154 lines (119 loc) 4.44 kB
/*jshint expr: true*/ require('chai').should(); var proxyquire = require('proxyquire').noCallThru(); var EventEmitter = require('events').EventEmitter; var moduleUnderTestPath = '../lib/middlewares/connectLogger'; describe('Logger middleware', function () { afterEach(function () { delete require.cache[require.resolve(moduleUnderTestPath)]; }); var createFakeResponse = function () { var fakeResponse = new EventEmitter(); fakeResponse.end = function () { fakeResponse.emit('finish'); }; fakeResponse.headersSent = []; fakeResponse.statusCode = 123; return fakeResponse; }; it('should produce a log message with info from request & response after it completes', function (done) { var request = { originalUrl: '/badger.html', url: '/asiarooms/en-gb/badger.html', method: 'GET', headers: { foo: 'bar' }, socket: { remoteAddress: '123.123.123.123' }, moonstick: { metrics: 'some metrics' } }; var response = createFakeResponse(); response.headers = { ETag: '123456789' }; var mockLogger = function () { return { info: function (message, data) { message.should.equal('Request handled'); data.metrics.should.equal('some metrics'); data.status.should.equal(123); data.originalUrl.should.equal('/badger.html'); data.url.should.equal('/asiarooms/en-gb/badger.html'); data.remoteAddress.should.equal('123.123.123.123'); data.method.should.equal('GET'); data.requestHeaders.should.equal(request.headers); data.responseHeaders.should.equal(response.headers); done(); } }; }; var middleware = proxyquire(moduleUnderTestPath, { 'tlrg-logger': mockLogger }); middleware(request, response, function () {}); response.end(); }); it('should still produce a log message if the request "closes" rather than completes', function (done) { var mockLogger = function () { return { info: function (message) { message.should.equal('Request handled'); done(); } }; }; var middleware = proxyquire(moduleUnderTestPath, { 'tlrg-logger': mockLogger }); var response = createFakeResponse(); var request = { url: '/stuff' }; middleware(request, response, function () {}); response.emit('close'); }); it('log messages should contain startTime and endTime timestamps in ms since epoc format', function (done) { var mockLogger = function () { return { info: function (message, data) { message.should.equal('Request handled'); data.startTime.should.be.a('number'); data.endTime.should.be.a('number'); data.endTime.should.be.above(data.startTime); done(); } }; }; var middleware = proxyquire(moduleUnderTestPath, { 'tlrg-logger': mockLogger }); var request = { url: '/badger.html' }; var response = createFakeResponse(); middleware(request, response, function () {}); setTimeout(function () { response.end(); }, 50); }); it('should unsubscribe from response events after logging', function (done) { var middleware = require(moduleUnderTestPath); var response = createFakeResponse(); var eventsUnsubscribedFrom = {}; response.removeListener = function (eventName) { eventsUnsubscribedFrom[eventName] = true; if (eventsUnsubscribedFrom.close && eventsUnsubscribedFrom.finish) { done(); } }; var request = { url: '/badger.html' }; middleware(request, response, function () {}); response.end(); }); });