hapi
Version:
HTTP Server framework
205 lines (144 loc) • 8.26 kB
JavaScript
// Load modules
var Lab = require('lab');
var Shot = require('shot');
var Hapi = require('../..');
var Request = require('../../lib/request');
// Declare internals
var internals = {};
// Test shortcuts
var expect = Lab.expect;
var before = Lab.before;
var after = Lab.after;
var describe = Lab.experiment;
var it = Lab.test;
describe('Request', function () {
var server = new Hapi.Server();
var _req = null;
var _res = null;
var reqOptions = {
url: 'http://localhost',
method: 'GET',
headers: []
};
before(function (done) {
Shot.inject(function (req, res) {
_req = req;
_res = res;
done();
}, reqOptions,
function () { }
);
});
it('throws an error if constructed without new', function (done) {
var fn = function () {
var request = Request(server, null, null);
};
expect(fn).throws(Error, 'Request must be instantiated using new');
done();
});
it('throws an error when no server is provided', function (done) {
var fn = function () {
var request = new Request(null, _req, _res);
};
expect(fn).throws(Error, 'server must be provided');
done();
});
it('throws an error when no req is provided', function (done) {
var fn = function () {
var request = new Request(server, null, _res);
};
expect(fn).throws(Error, 'req must be provided');
done();
});
it('throws an error when no res is provided', function (done) {
var fn = function () {
var request = new Request(server, _req, null);
};
expect(fn).throws(Error, 'res must be provided');
done();
});
it('is created without error when correct parameters are provided', function (done) {
var fn = function () {
var request = new Request(server, _req, _res);
};
expect(fn).not.to.throw(Error);
done();
});
describe('#_setMethod', function () {
it('changes method with a lowercase version of the value passed in', function (done) {
var request = new Request(server, _req, _res);
request._setMethod('GET');
expect(request.method).to.equal('get');
done();
});
});
describe('#_setUrl', function () {
it('sets url, path, and query', function (done) {
var request = new Request(server, _req, _res);
var url = 'http://localhost/page?param1=something';
request._setUrl(url);
expect(request.url).to.exist;
expect(request.url.href).to.equal(url);
expect(request.path).to.equal('/page');
expect(request.query.param1).to.equal('something');
done();
});
});
describe('#log', function () {
it('adds a log event to the request', function (done) {
var request = new Request(server, _req, _res);
request.log('1', 'log event 1', Date.now());
request.log(['2'], 'log event 2', new Date(Date.now()));
request.log(['3', '4']);
request.log(['1', '4']);
request.log(['2', '3']);
request.log(['4']);
request.log('4');
expect(request.getLog('1').length).to.equal(2);
expect(request.getLog('4').length).to.equal(4);
expect(request.getLog(['4']).length).to.equal(4);
expect(request.getLog('0').length).to.equal(0);
expect(request.getLog().length).to.be.above(7);
done();
});
it('doesn\'t throw an error when logging without data and debug is configured', function (done) {
var debugServer = new Hapi.Server({ debug: { request: ['uncaught'] } });
var request = new Request(debugServer, _req, _res);
var fn = function () {
request.log('uncaught', null, Date.now());
};
var orig = console.error;
console.error = function (msg) {
expect(msg).to.equal('Unmonitored error: uncaught');
console.error = orig;
};
expect(fn).to.not.throw(Error);
done();
});
});
describe('path normalization', function () {
var rawPath = '/%0%1%2%3%4%5%6%7%8%9%a%b%c%d%e%f%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f%20%21%22%23%24%25%26%27%28%29%2a%2b%2c%2d%2e%2f%30%31%32%33%34%35%36%37%38%39%3a%3b%3c%3d%3e%3f%40%41%42%43%44%45%46%47%48%49%4a%4b%4c%4d%4e%4f%50%51%52%53%54%55%56%57%58%59%5a%5b%5c%5d%5e%5f%60%61%62%63%64%65%66%67%68%69%6a%6b%6c%6d%6e%6f%70%71%72%73%74%75%76%77%78%79%7a%7b%7c%7d%7e%7f%80%81%82%83%84%85%86%87%88%89%8a%8b%8c%8d%8e%8f%90%91%92%93%94%95%96%97%98%99%9a%9b%9c%9d%9e%9f%a0%a1%a2%a3%a4%a5%a6%a7%a8%a9%aa%ab%ac%ad%ae%af%b0%b1%b2%b3%b4%b5%b6%b7%b8%b9%ba%bb%bc%bd%be%bf%c0%c1%c2%c3%c4%c5%c6%c7%c8%c9%ca%cb%cc%cd%ce%cf%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%da%db%dc%dd%de%df%e0%e1%e2%e3%e4%e5%e6%e7%e8%e9%ea%eb%ec%ed%ee%ef%f0%f1%f2%f3%f4%f5%f6%f7%f8%f9%fa%fb%fc%fd%fe%ff%0%1%2%3%4%5%6%7%8%9%A%B%C%D%E%F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C%2D%2E%2F%30%31%32%33%34%35%36%37%38%39%3A%3B%3C%3D%3E%3F%40%41%42%43%44%45%46%47%48%49%4A%4B%4C%4D%4E%4F%50%51%52%53%54%55%56%57%58%59%5A%5B%5C%5D%5E%5F%60%61%62%63%64%65%66%67%68%69%6A%6B%6C%6D%6E%6F%70%71%72%73%74%75%76%77%78%79%7A%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF';
var normPath = '/%0%1%2%3%4%5%6%7%8%9%a%b%c%d%e%f%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&\'()*+,-.%2F0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF%0%1%2%3%4%5%6%7%8%9%A%B%C%D%E%F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25&\'()*+,-.%2F0123456789:;%3C=%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF';
it('doesn\'t normalize a path when normalization is disabled', function (done) {
var request = new Request(server, _req, _res);
var url = 'http://localhost' + rawPath + '?param1=something';
request._setUrl(url);
expect(request.url).to.exist;
expect(request.url.href).to.equal(url);
expect(request.path).to.equal(rawPath);
expect(request.query.param1).to.equal('something');
done();
});
it('normalizes a path when normalization is enabled', function (done) {
var normServer = new Hapi.Server({ router: { normalizeRequestPath: true } });
var request = new Request(normServer, _req, _res);
var url = 'http://localhost' + rawPath + '?param1=something';
request._setUrl(url);
expect(request.url).to.exist;
expect(request.url.href).to.equal(url);
expect(request.path).to.equal(normPath);
expect(request.query.param1).to.equal('something');
done();
});
});
});