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