You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
341 lines
7.2 KiB
341 lines
7.2 KiB
'use strict';
|
|
|
|
const assert = require('assert');
|
|
const Kareem = require('../');
|
|
|
|
describe('execPre', function() {
|
|
var hooks;
|
|
|
|
beforeEach(function() {
|
|
hooks = new Kareem();
|
|
});
|
|
|
|
it('handles errors with multiple pres', function(done) {
|
|
var execed = {};
|
|
|
|
hooks.pre('cook', function(done) {
|
|
execed.first = true;
|
|
done();
|
|
});
|
|
|
|
hooks.pre('cook', function(done) {
|
|
execed.second = true;
|
|
done('error!');
|
|
});
|
|
|
|
hooks.pre('cook', function(done) {
|
|
execed.third = true;
|
|
done();
|
|
});
|
|
|
|
hooks.execPre('cook', null, function(err) {
|
|
assert.equal('error!', err);
|
|
assert.equal(2, Object.keys(execed).length);
|
|
assert.ok(execed.first);
|
|
assert.ok(execed.second);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('sync errors', function(done) {
|
|
var called = 0;
|
|
|
|
hooks.pre('cook', function(next) {
|
|
throw new Error('woops!');
|
|
});
|
|
|
|
hooks.pre('cook', function(next) {
|
|
++called;
|
|
next();
|
|
});
|
|
|
|
hooks.execPre('cook', null, function(err) {
|
|
assert.equal(err.message, 'woops!');
|
|
assert.equal(called, 0);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('unshift', function() {
|
|
var f1 = function() {};
|
|
var f2 = function() {};
|
|
hooks.pre('cook', false, f1);
|
|
hooks.pre('cook', false, f2, null, true);
|
|
assert.strictEqual(hooks._pres.get('cook')[0].fn, f2);
|
|
assert.strictEqual(hooks._pres.get('cook')[1].fn, f1);
|
|
});
|
|
|
|
it('throws error if no function', function() {
|
|
assert.throws(() => hooks.pre('test'), /got "undefined"/);
|
|
});
|
|
|
|
it('arbitrary options', function() {
|
|
const f1 = function() {};
|
|
const f2 = function() {};
|
|
hooks.pre('cook', { foo: 'bar' }, f1);
|
|
hooks.pre('cook', { bar: 'baz' }, f2, null, true);
|
|
assert.equal(hooks._pres.get('cook')[1].foo, 'bar');
|
|
assert.equal(hooks._pres.get('cook')[0].bar, 'baz');
|
|
});
|
|
|
|
it('handles async errors', function(done) {
|
|
var execed = {};
|
|
|
|
hooks.pre('cook', true, function(next, done) {
|
|
execed.first = true;
|
|
setTimeout(
|
|
function() {
|
|
done('error!');
|
|
},
|
|
5);
|
|
|
|
next();
|
|
});
|
|
|
|
hooks.pre('cook', true, function(next, done) {
|
|
execed.second = true;
|
|
setTimeout(
|
|
function() {
|
|
done('other error!');
|
|
},
|
|
10);
|
|
|
|
next();
|
|
});
|
|
|
|
hooks.execPre('cook', null, function(err) {
|
|
assert.equal('error!', err);
|
|
assert.equal(2, Object.keys(execed).length);
|
|
assert.ok(execed.first);
|
|
assert.ok(execed.second);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('handles async errors in next()', function(done) {
|
|
var execed = {};
|
|
|
|
hooks.pre('cook', true, function(next, done) {
|
|
execed.first = true;
|
|
setTimeout(
|
|
function() {
|
|
done('other error!');
|
|
},
|
|
15);
|
|
|
|
next();
|
|
});
|
|
|
|
hooks.pre('cook', true, function(next, done) {
|
|
execed.second = true;
|
|
setTimeout(
|
|
function() {
|
|
next('error!');
|
|
done('another error!');
|
|
},
|
|
5);
|
|
});
|
|
|
|
hooks.execPre('cook', null, function(err) {
|
|
assert.equal('error!', err);
|
|
assert.equal(2, Object.keys(execed).length);
|
|
assert.ok(execed.first);
|
|
assert.ok(execed.second);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('handles async errors in next() when already done', function(done) {
|
|
var execed = {};
|
|
|
|
hooks.pre('cook', true, function(next, done) {
|
|
execed.first = true;
|
|
setTimeout(
|
|
function() {
|
|
done('other error!');
|
|
},
|
|
5);
|
|
|
|
next();
|
|
});
|
|
|
|
hooks.pre('cook', true, function(next, done) {
|
|
execed.second = true;
|
|
setTimeout(
|
|
function() {
|
|
next('error!');
|
|
done('another error!');
|
|
},
|
|
25);
|
|
});
|
|
|
|
hooks.execPre('cook', null, function(err) {
|
|
assert.equal('other error!', err);
|
|
assert.equal(2, Object.keys(execed).length);
|
|
assert.ok(execed.first);
|
|
assert.ok(execed.second);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('async pres with clone()', function(done) {
|
|
var execed = false;
|
|
|
|
hooks.pre('cook', true, function(next, done) {
|
|
execed = true;
|
|
setTimeout(
|
|
function() {
|
|
done();
|
|
},
|
|
5);
|
|
|
|
next();
|
|
});
|
|
|
|
hooks.clone().execPre('cook', null, function(err) {
|
|
assert.ifError(err);
|
|
assert.ok(execed);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('returns correct error when async pre errors', function(done) {
|
|
var execed = {};
|
|
|
|
hooks.pre('cook', true, function(next, done) {
|
|
execed.first = true;
|
|
setTimeout(
|
|
function() {
|
|
done('other error!');
|
|
},
|
|
5);
|
|
|
|
next();
|
|
});
|
|
|
|
hooks.pre('cook', function(next) {
|
|
execed.second = true;
|
|
setTimeout(
|
|
function() {
|
|
next('error!');
|
|
},
|
|
15);
|
|
});
|
|
|
|
hooks.execPre('cook', null, function(err) {
|
|
assert.equal('other error!', err);
|
|
assert.equal(2, Object.keys(execed).length);
|
|
assert.ok(execed.first);
|
|
assert.ok(execed.second);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('lets async pres run when fully sync pres are done', function(done) {
|
|
var execed = {};
|
|
|
|
hooks.pre('cook', true, function(next, done) {
|
|
execed.first = true;
|
|
setTimeout(
|
|
function() {
|
|
done();
|
|
},
|
|
5);
|
|
|
|
next();
|
|
});
|
|
|
|
hooks.pre('cook', function() {
|
|
execed.second = true;
|
|
});
|
|
|
|
hooks.execPre('cook', null, function(err) {
|
|
assert.ifError(err);
|
|
assert.equal(2, Object.keys(execed).length);
|
|
assert.ok(execed.first);
|
|
assert.ok(execed.second);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('allows passing arguments to the next pre', function(done) {
|
|
var execed = {};
|
|
|
|
hooks.pre('cook', function(next) {
|
|
execed.first = true;
|
|
next(null, 'test');
|
|
});
|
|
|
|
hooks.pre('cook', function(next, p) {
|
|
execed.second = true;
|
|
assert.equal(p, 'test');
|
|
next();
|
|
});
|
|
|
|
hooks.pre('cook', function(next, p) {
|
|
execed.third = true;
|
|
assert.ok(!p);
|
|
next();
|
|
});
|
|
|
|
hooks.execPre('cook', null, function(err) {
|
|
assert.ifError(err);
|
|
assert.equal(3, Object.keys(execed).length);
|
|
assert.ok(execed.first);
|
|
assert.ok(execed.second);
|
|
assert.ok(execed.third);
|
|
done();
|
|
});
|
|
});
|
|
|
|
it('handles sync errors in pre if there are more hooks', function(done) {
|
|
var execed = {};
|
|
|
|
hooks.pre('cook', function() {
|
|
execed.first = true;
|
|
throw new Error('Oops!');
|
|
});
|
|
|
|
hooks.pre('cook', function() {
|
|
execed.second = true;
|
|
});
|
|
|
|
hooks.execPre('cook', null, function(err) {
|
|
assert.ok(err);
|
|
assert.ok(execed.first);
|
|
assert.equal(err.message, 'Oops!');
|
|
done();
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('execPreSync', function() {
|
|
var hooks;
|
|
|
|
beforeEach(function() {
|
|
hooks = new Kareem();
|
|
});
|
|
|
|
it('executes hooks synchronously', function() {
|
|
var execed = {};
|
|
|
|
hooks.pre('cook', function() {
|
|
execed.first = true;
|
|
});
|
|
|
|
hooks.pre('cook', function() {
|
|
execed.second = true;
|
|
});
|
|
|
|
hooks.execPreSync('cook', null);
|
|
assert.ok(execed.first);
|
|
assert.ok(execed.second);
|
|
});
|
|
|
|
it('works with no hooks specified', function() {
|
|
assert.doesNotThrow(function() {
|
|
hooks.execPreSync('cook', null);
|
|
});
|
|
});
|
|
});
|