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.
		
		
		
		
		
			
		
			
				
					343 lines
				
				6.3 KiB
			
		
		
			
		
	
	
					343 lines
				
				6.3 KiB
			| 
											3 years ago
										 | var assert = require('assert'); | ||
|  | var Kareem = require('../'); | ||
|  | 
 | ||
|  | describe('wrap()', function() { | ||
|  |   var hooks; | ||
|  | 
 | ||
|  |   beforeEach(function() { | ||
|  |     hooks = new Kareem(); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('handles pre errors', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       done('error!'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(obj) { | ||
|  |       obj.tofu = 'no'; | ||
|  |     }); | ||
|  | 
 | ||
|  |     var obj = { bacon: 0, eggs: 0 }; | ||
|  | 
 | ||
|  |     var args = [obj]; | ||
|  |     args.push(function(error, result) { | ||
|  |       assert.equal('error!', error); | ||
|  |       assert.ok(!result); | ||
|  |       assert.equal(undefined, obj.tofu); | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(o, callback) { | ||
|  |         // Should never get called
 | ||
|  |         assert.ok(false); | ||
|  |         callback(null, o); | ||
|  |       }, | ||
|  |       obj, | ||
|  |       args); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('handles pre errors when no callback defined', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       done('error!'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(obj) { | ||
|  |       obj.tofu = 'no'; | ||
|  |     }); | ||
|  | 
 | ||
|  |     var obj = { bacon: 0, eggs: 0 }; | ||
|  | 
 | ||
|  |     var args = [obj]; | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(o, callback) { | ||
|  |         // Should never get called
 | ||
|  |         assert.ok(false); | ||
|  |         callback(null, o); | ||
|  |       }, | ||
|  |       obj, | ||
|  |       args); | ||
|  | 
 | ||
|  |     setTimeout( | ||
|  |       function() { | ||
|  |         done(); | ||
|  |       }, | ||
|  |       25); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('handles errors in wrapped function', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(obj) { | ||
|  |       obj.tofu = 'no'; | ||
|  |     }); | ||
|  | 
 | ||
|  |     var obj = { bacon: 0, eggs: 0 }; | ||
|  | 
 | ||
|  |     var args = [obj]; | ||
|  |     args.push(function(error, result) { | ||
|  |       assert.equal('error!', error); | ||
|  |       assert.ok(!result); | ||
|  |       assert.equal(undefined, obj.tofu); | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(o, callback) { | ||
|  |         callback('error!'); | ||
|  |       }, | ||
|  |       obj, | ||
|  |       args); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('handles errors in post', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(obj, callback) { | ||
|  |       obj.tofu = 'no'; | ||
|  |       callback('error!'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     var obj = { bacon: 0, eggs: 0 }; | ||
|  | 
 | ||
|  |     var args = [obj]; | ||
|  |     args.push(function(error, result) { | ||
|  |       assert.equal('error!', error); | ||
|  |       assert.ok(!result); | ||
|  |       assert.equal('no', obj.tofu); | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(o, callback) { | ||
|  |         callback(null, o); | ||
|  |       }, | ||
|  |       obj, | ||
|  |       args); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('defers errors to post hooks if enabled', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       done(new Error('fail')); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(error, res, callback) { | ||
|  |       callback(new Error('another error occurred')); | ||
|  |     }); | ||
|  | 
 | ||
|  |     var args = []; | ||
|  |     args.push(function(error) { | ||
|  |       assert.equal(error.message, 'another error occurred'); | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(callback) { | ||
|  |         assert.ok(false); | ||
|  |         callback(); | ||
|  |       }, | ||
|  |       null, | ||
|  |       args, | ||
|  |       { useErrorHandlers: true, numCallbackParams: 1 }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('error handlers with no callback', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       done(new Error('fail')); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(error, callback) { | ||
|  |       assert.equal(error.message, 'fail'); | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     var args = []; | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(callback) { | ||
|  |         assert.ok(false); | ||
|  |         callback(); | ||
|  |       }, | ||
|  |       null, | ||
|  |       args, | ||
|  |       { useErrorHandlers: true }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('error handlers with no error', function(done) { | ||
|  |     hooks.post('cook', function(error, callback) { | ||
|  |       callback(new Error('another error occurred')); | ||
|  |     }); | ||
|  | 
 | ||
|  |     var args = []; | ||
|  |     args.push(function(error) { | ||
|  |       assert.ifError(error); | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(callback) { | ||
|  |         callback(); | ||
|  |       }, | ||
|  |       null, | ||
|  |       args, | ||
|  |       { useErrorHandlers: true }); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('works with no args', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(callback) { | ||
|  |       obj.tofu = 'no'; | ||
|  |       callback(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     var obj = { bacon: 0, eggs: 0 }; | ||
|  | 
 | ||
|  |     var args = []; | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(callback) { | ||
|  |         callback(null); | ||
|  |       }, | ||
|  |       obj, | ||
|  |       args); | ||
|  | 
 | ||
|  |     setTimeout( | ||
|  |       function() { | ||
|  |         assert.equal('no', obj.tofu); | ||
|  |         done(); | ||
|  |       }, | ||
|  |       25); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('handles pre errors with no args', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       done('error!'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(callback) { | ||
|  |       obj.tofu = 'no'; | ||
|  |       callback(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     var obj = { bacon: 0, eggs: 0 }; | ||
|  | 
 | ||
|  |     var args = []; | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(callback) { | ||
|  |         callback(null); | ||
|  |       }, | ||
|  |       obj, | ||
|  |       args); | ||
|  | 
 | ||
|  |     setTimeout( | ||
|  |       function() { | ||
|  |         assert.equal(undefined, obj.tofu); | ||
|  |         done(); | ||
|  |       }, | ||
|  |       25); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('handles wrapped function errors with no args', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       obj.waffles = false; | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(callback) { | ||
|  |       obj.tofu = 'no'; | ||
|  |       callback(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     var obj = { bacon: 0, eggs: 0 }; | ||
|  | 
 | ||
|  |     var args = []; | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(callback) { | ||
|  |         callback('error!'); | ||
|  |       }, | ||
|  |       obj, | ||
|  |       args); | ||
|  | 
 | ||
|  |     setTimeout( | ||
|  |       function() { | ||
|  |         assert.equal(false, obj.waffles); | ||
|  |         assert.equal(undefined, obj.tofu); | ||
|  |         done(); | ||
|  |       }, | ||
|  |       25); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('handles post errors with no args', function(done) { | ||
|  |     hooks.pre('cook', function(done) { | ||
|  |       obj.waffles = false; | ||
|  |       done(); | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function(callback) { | ||
|  |       obj.tofu = 'no'; | ||
|  |       callback('error!'); | ||
|  |     }); | ||
|  | 
 | ||
|  |     var obj = { bacon: 0, eggs: 0 }; | ||
|  | 
 | ||
|  |     var args = []; | ||
|  | 
 | ||
|  |     hooks.wrap( | ||
|  |       'cook', | ||
|  |       function(callback) { | ||
|  |         callback(); | ||
|  |       }, | ||
|  |       obj, | ||
|  |       args); | ||
|  | 
 | ||
|  |     setTimeout( | ||
|  |       function() { | ||
|  |         assert.equal(false, obj.waffles); | ||
|  |         assert.equal('no', obj.tofu); | ||
|  |         done(); | ||
|  |       }, | ||
|  |       25); | ||
|  |   }); | ||
|  | 
 | ||
|  |   it('sync wrappers', function() { | ||
|  |     var calledPre = 0; | ||
|  |     var calledFn = 0; | ||
|  |     var calledPost = 0; | ||
|  |     hooks.pre('cook', function() { | ||
|  |       ++calledPre; | ||
|  |     }); | ||
|  | 
 | ||
|  |     hooks.post('cook', function() { | ||
|  |       ++calledPost; | ||
|  |     }); | ||
|  | 
 | ||
|  |     var wrapper = hooks.createWrapperSync('cook', function() { ++calledFn; }); | ||
|  | 
 | ||
|  |     wrapper(); | ||
|  | 
 | ||
|  |     assert.equal(calledPre, 1); | ||
|  |     assert.equal(calledFn, 1); | ||
|  |     assert.equal(calledPost, 1); | ||
|  |   }); | ||
|  | }); |