'use strict';
const assert = require('assert');
const Kareem = require('../');
const { beforeEach, describe, it } = require('mocha');
describe('execPost', function() {
var hooks;
beforeEach(function() {
hooks = new Kareem();
});
it('handles errors', function(done) {
hooks.post('cook', function(eggs, callback) {
callback('error!');
});
hooks.execPost('cook', null, [4], function(error, eggs) {
assert.equal('error!', error);
assert.ok(!eggs);
done();
});
});
it('unshift', function() {
var f1 = function() {};
var f2 = function() {};
hooks.post('cook', f1);
hooks.post('cook', f2, true);
assert.strictEqual(hooks._posts.get('cook')[0].fn, f2);
assert.strictEqual(hooks._posts.get('cook')[1].fn, f1);
});
it('arbitrary options', function() {
const f1 = function() {};
const f2 = function() {};
hooks.post('cook', { foo: 'bar' }, f1);
hooks.post('cook', { bar: 'baz' }, f2, true);
assert.equal(hooks._posts.get('cook')[1].foo, 'bar');
assert.equal(hooks._posts.get('cook')[0].bar, 'baz');
});
it('throws error if no function', function() {
assert.throws(() => hooks.post('test'), /got "undefined"/);
});
it('multiple posts', function(done) {
hooks.post('cook', function(eggs, callback) {
setTimeout(
function() {
callback();
},
5);
});
hooks.post('cook', function(eggs, callback) {
setTimeout(
function() {
callback();
},
5);
});
hooks.execPost('cook', null, [4], function(error, eggs) {
assert.ifError(error);
assert.equal(4, eggs);
done();
});
});
it('error posts', function(done) {
var called = {};
hooks.post('cook', function(eggs, callback) {
called.first = true;
callback();
});
hooks.post('cook', function(eggs, callback) {
called.second = true;
callback(new Error('fail'));
});
hooks.post('cook', function(eggs, callback) {
assert.ok(false);
});
hooks.post('cook', function(error, eggs, callback) {
called.fourth = true;
assert.equal(error.message, 'fail');
callback(new Error('fourth'));
});
hooks.post('cook', function(error, eggs, callback) {
called.fifth = true;
assert.equal(error.message, 'fourth');
callback(new Error('fifth'));
});
hooks.execPost('cook', null, [4], function(error, eggs) {
assert.ok(error);
assert.equal(error.message, 'fifth');
assert.deepEqual(called, {
first: true,
second: true,
fourth: true,
fifth: true
});
done();
});
});
it('error posts with initial error', function(done) {
var called = {};
hooks.post('cook', function(eggs, callback) {
assert.ok(false);
});
hooks.post('cook', function(error, eggs, callback) {
called.second = true;
assert.equal(error.message, 'fail');
callback(new Error('second'));
});
hooks.post('cook', function(error, eggs, callback) {
called.third = true;
assert.equal(error.message, 'second');
callback(new Error('third'));
});
hooks.post('cook', function(error, eggs, callback) {
called.fourth = true;
assert.equal(error.message, 'third');
callback();
});
var options = { error: new Error('fail') };
hooks.execPost('cook', null, [4], options, function(error, eggs) {
assert.ok(error);
assert.equal(error.message, 'third');
assert.deepEqual(called, {
second: true,
third: true,
fourth: true
});
done();
});
});
it('supports returning a promise', function(done) {
var calledPost = 0;
hooks.post('cook', function() {
return new Promise(resolve => {
setTimeout(() => {
++calledPost;
resolve();
}, 100);
});
});
hooks.execPost('cook', null, [], {}, function(error) {
assert.ifError(error);
assert.equal(calledPost, 1);
done();
});
});
it('supports overwriteResult', function(done) {
hooks.post('cook', function(eggs, callback) {
callback(Kareem.overwriteResult(5));
});
hooks.post('cook', function(eggs, callback) {
assert.equal(eggs, 5);
callback();
});
var options = {};
hooks.execPost('cook', null, [4], options, function(error, eggs) {
assert.equal(eggs, 5);
done();
});
});
it('supports sync returning overwriteResult', function(done) {
hooks.post('cook', function() {
return Kareem.overwriteResult(5);
});
hooks.post('cook', function(eggs, callback) {
assert.equal(eggs, 5);
callback();
});
var options = {};
hooks.execPost('cook', null, [4], options, function(error, eggs) {
assert.ifError(error);
assert.equal(eggs, 5);
done();
});
});
it('supports sync overwriteResult', function() {
hooks.post('cook', function(eggs) {
return Kareem.overwriteResult(5);
});
hooks.post('cook', function(eggs) {
assert.equal(eggs, 5);
});
var options = {};
const res = hooks.execPostSync('cook', null, [4], options);
assert.deepEqual(res, [5]);
});
it('supports overwriteResult with promises', function(done) {
hooks.post('cook', function(eggs) {
return Promise.resolve(Kareem.overwriteResult(5));
});
hooks.post('cook', function(eggs) {
assert.equal(eggs, 5);
});
var options = {};
hooks.execPost('cook', null, [4], options, function(error, eggs) {
assert.equal(eggs, 5);
done();
});
});
});
describe('execPostSync', function() {
var hooks;
beforeEach(function() {
hooks = new Kareem();
});
it('executes hooks synchronously', function() {
var execed = {};
hooks.post('cook', function() {
execed.first = true;
});
hooks.post('cook', function() {
execed.second = true;
});
hooks.execPostSync('cook', null);
assert.ok(execed.first);
assert.ok(execed.second);
});
it('works with no hooks specified', function() {
assert.doesNotThrow(function() {
hooks.execPostSync('cook', null);
});
});
});