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.
		
		
		
		
		
			
		
			
				
					199 lines
				
				4.5 KiB
			
		
		
			
		
	
	
					199 lines
				
				4.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const assert = require('assert');
							 | 
						||
| 
								 | 
							
								const Kareem = require('../');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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();
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 |