Skip to content

Commit

Permalink
Change default helper key generator. Closes hapijs#1246
Browse files Browse the repository at this point in the history
  • Loading branch information
Eran Hammer committed Dec 21, 2013
1 parent 9b679b9 commit 19b0a19
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 50 deletions.
4 changes: 2 additions & 2 deletions lib/pack.js
Original file line number Diff line number Diff line change
Expand Up @@ -706,7 +706,7 @@ internals.Pack.prototype._helper = function (name, method, options) {

internals.generateKey = function () {

var key = '';
var key = 'h';
for (var i = 0, il = arguments.length - 1; i < il; ++i) { // 'arguments.length - 1' to skip 'next'
var arg = arguments[i];
if (typeof arg !== 'string' &&
Expand All @@ -716,7 +716,7 @@ internals.generateKey = function () {
return null;
}

key += (i > 0 ? ':' : '') + encodeURIComponent(arg);
key += ':' + encodeURIComponent(arg.toString());
}

return key;
Expand Down
128 changes: 80 additions & 48 deletions test/unit/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ describe('Server', function () {

var fn = function () {

Hapi.Server('0.0.0.0', 0, {});
Hapi.Server();
};
expect(fn).throws(Error, 'Server must be instantiated using new');
done();
Expand All @@ -53,14 +53,14 @@ describe('Server', function () {

it('defaults to port 80 when a null port is provided', function (done) {

var server = new Hapi.Server('0.0.0.0', null);
var server = new Hapi.Server(null);
expect(server.info.port).to.be.equal(80);
done();
});

it('allows a ephemeral port to be set', function (done) {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server(0);
expect(server.info.port).to.be.equal(0);
done();
});
Expand All @@ -79,7 +79,7 @@ describe('Server', function () {

var fn = function () {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server('localhost', 8888);
};
expect(fn).to.not.throw(Error);
done();
Expand Down Expand Up @@ -168,7 +168,7 @@ describe('Server', function () {

it('assigns this.views when config enables views', function (done) {

var server = new Hapi.Server('0.0.0.0', 0, {
var server = new Hapi.Server({
views: {
engines: { 'html': 'handlebars' }
}
Expand All @@ -179,7 +179,7 @@ describe('Server', function () {

it('creates an https server when passed tls options', function (done) {

var server = new Hapi.Server('0.0.0.0', 0, { tls: tlsOptions });
var server = new Hapi.Server({ tls: tlsOptions });
expect(server.listener instanceof Https.Server).to.equal(true);
done();
});
Expand All @@ -188,7 +188,7 @@ describe('Server', function () {

var fn = function () {

var server = new Hapi.Server('0.0.0.0', 0, { auth: { scheme: 'basic', validateFunc: function () { } } });
var server = new Hapi.Server({ auth: { scheme: 'basic', validateFunc: function () { } } });
};
expect(fn).to.not.throw(Error);
done();
Expand All @@ -200,16 +200,16 @@ describe('Server', function () {

var fn = function () {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server(0);
server.start();
};
expect(fn).to.not.throw(Error);
done();
});

it('calls the callback when one is used', function (done) {
it('calls the callback when provided', function (done) {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server(0);
server.start(function () {

expect(server.info.host).to.equal('0.0.0.0');
Expand All @@ -218,7 +218,7 @@ describe('Server', function () {
});
});

it('calls the callback when one is used with tls', function (done) {
it('calls the callback when provided with tls', function (done) {

var server = new Hapi.Server('0.0.0.0', 0, { tls: tlsOptions });
server.start(function () {
Expand Down Expand Up @@ -247,7 +247,7 @@ describe('Server', function () {
expect(fn).to.not.throw(Error);
});

it('ignores repeated calls when the server isn\'t started', function (done) {
it('ignores repeated calls when the server is not started', function (done) {

var fn = function () {

Expand Down Expand Up @@ -284,7 +284,7 @@ describe('Server', function () {
var fn = function () {

var route = {};
var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.route(route);
};
expect(fn).to.throw(Error);
Expand All @@ -298,7 +298,7 @@ describe('Server', function () {
var route = {
path: '/test'
};
var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.route(route);
};
expect(fn).to.throw(Error);
Expand All @@ -313,7 +313,7 @@ describe('Server', function () {
path: '/test',
method: 'put'
};
var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.route(route);
};
expect(fn).to.throw(Error);
Expand All @@ -327,7 +327,7 @@ describe('Server', function () {
method: 'put',
handler: function () { }
};
var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.route(route);

expect(server._router._table.put[0].path).to.equal('/test');
Expand Down Expand Up @@ -409,7 +409,7 @@ describe('Server', function () {
method: 'post',
handler: function () { }
}];
var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.route(routes);

expect(server._router._table.put[0].path).to.equal('/test');
Expand All @@ -423,7 +423,7 @@ describe('Server', function () {

var fn = function () {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.helper(0, function () { });
};
expect(fn).to.throw(Error);
Expand All @@ -434,7 +434,7 @@ describe('Server', function () {

var fn = function () {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.helper('user', 'function');
};
expect(fn).to.throw(Error);
Expand All @@ -445,7 +445,7 @@ describe('Server', function () {

var fn = function () {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.helper('user', function () { }, 'options');
};
expect(fn).to.throw(Error);
Expand All @@ -456,7 +456,7 @@ describe('Server', function () {

var fn = function () {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.helper('user', function () { }, { generateKey: 'function' });
};
expect(fn).to.throw(Error);
Expand All @@ -467,7 +467,7 @@ describe('Server', function () {

var fn = function () {

var server = new Hapi.Server('0.0.0.0', 0, { cache: 'memory' });
var server = new Hapi.Server({ cache: 'memory' });
server.helper('user', function () { }, { cache: { x: 'y' } });
};
expect(fn).to.throw(Error);
Expand All @@ -476,7 +476,7 @@ describe('Server', function () {

it('returns a valid result when calling a helper without using the cache', function (done) {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.helper('user', function (id, next) { return next({ id: id }); });
server.helpers.user(4, function (result) {

Expand All @@ -487,7 +487,7 @@ describe('Server', function () {

it('returns a valid result when calling a helper when using the cache', function (done) {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server(0);
server.start(function () {

server.helper('user', function (id, str, next) { return next({ id: id, str: str }); }, { cache: { expiresIn: 1000 } });
Expand All @@ -502,7 +502,7 @@ describe('Server', function () {

it('returns an error result when calling a helper that returns an error', function (done) {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
server.helper('user', function (id, next) { return next(new Error()); });
server.helpers.user(4, function (result) {

Expand All @@ -513,7 +513,7 @@ describe('Server', function () {

it('returns a different result when calling a helper without using the cache', function (done) {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();
var gen = 0;
server.helper('user', function (id, next) { return next({ id: id, gen: ++gen }); });
server.helpers.user(4, function (result1) {
Expand All @@ -533,11 +533,13 @@ describe('Server', function () {

it('returns a valid result when calling a helper using the cache', function (done) {

var server = new Hapi.Server('0.0.0.0', 0, { cache: 'memory' });
var server = new Hapi.Server(0, { cache: 'memory' });

var gen = 0;
server.helper('user', function (id, next) { return next({ id: id, gen: ++gen }); }, { cache: { expiresIn: 2000 } });

server.start(function () {

var gen = 0;
server.helper('user', function (id, next) { return next({ id: id, gen: ++gen }); }, { cache: { expiresIn: 2000 } });
var id = Math.random();
server.helpers.user(id, function (result1) {

Expand All @@ -553,29 +555,56 @@ describe('Server', function () {
});
});

it('supports empty key helper', function (done) {

var server = new Hapi.Server(0, { cache: 'memory' });

var gen = 0;
var terms = 'I agree to give my house';
server.helper('tos', function (next) { return next({ gen: gen++, terms: terms }); }, { cache: { expiresIn: 2000 } });

server.start(function () {

server.helpers.tos(function (result1) {

expect(result1.terms).to.equal(terms);
expect(result1.gen).to.equal(0);
server.helpers.tos(function (result2) {

expect(result2.terms).to.equal(terms);
expect(result2.gen).to.equal(0);
done();
});
});
});
});

it('returns valid results when calling a helper (with different keys) using the cache', function (done) {

var server = new Hapi.Server('0.0.0.0', 0, { cache: 'memory' });
var server = new Hapi.Server(0, { cache: 'memory' });
var gen = 0;
server.helper('user', function (id, next) { return next({ id: id, gen: ++gen }); }, { cache: { expiresIn: 2000 } });
var id1 = Math.random();
server.helpers.user(id1, function (result1) {
server.start(function () {

var id1 = Math.random();
server.helpers.user(id1, function (result1) {

expect(result1.id).to.equal(id1);
expect(result1.gen).to.equal(1);
var id2 = Math.random();
server.helpers.user(id2, function (result2) {
expect(result1.id).to.equal(id1);
expect(result1.gen).to.equal(1);
var id2 = Math.random();
server.helpers.user(id2, function (result2) {

expect(result2.id).to.equal(id2);
expect(result2.gen).to.equal(2);
done();
expect(result2.id).to.equal(id2);
expect(result2.gen).to.equal(2);
done();
});
});
});
});

it('returns new object (not cached) when second key generation fails when using the cache', function (done) {

var server = new Hapi.Server('0.0.0.0', 0, { cache: 'memory' });
var server = new Hapi.Server(0, { cache: 'memory' });
var id1 = Math.random();
var gen = 0;
var helper = function (id, next) {
Expand All @@ -589,16 +618,19 @@ describe('Server', function () {

server.helper('user', helper, { cache: { expiresIn: 2000 } });

server.helpers.user(id1, function (result1) {
server.start(function () {

server.helpers.user(id1, function (result1) {

expect(result1.id).to.equal(id1);
expect(result1.gen).to.equal(1);
expect(result1.id).to.equal(id1);
expect(result1.gen).to.equal(1);

server.helpers.user(function () { }, function (result2) {
server.helpers.user(function () { }, function (result2) {

expect(result2.id).to.equal(id1);
expect(result2.gen).to.equal(2);
done();
expect(result2.id).to.equal(id1);
expect(result2.gen).to.equal(2);
done();
});
});
});
});
Expand All @@ -609,7 +641,7 @@ describe('Server', function () {

it('returns an array of the current routes', function (done) {

var server = new Hapi.Server('0.0.0.0', 0);
var server = new Hapi.Server();

server.route({ path: '/test/', method: 'get', handler: function () { } });
server.route({ path: '/test/{p}/end', method: 'get', handler: function () { } });
Expand Down

0 comments on commit 19b0a19

Please sign in to comment.