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); | ||
|  |     }); | ||
|  |   }); | ||
|  | }); |