@tlrg/middleware-js
Version:
Node module for sharing common middlewares.
154 lines (119 loc) • 4.44 kB
JavaScript
/*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();
});
});