|
|
var assert = require('assert'), cb = require('../');
function invokeAsync(callback) { setTimeout(function() { callback(null, 'foo'); }, 100); }
function invokeAsyncError(callback) { setTimeout(function() { callback(new Error()); }, 100); }
function invokeAsyncTwice(callback) { setTimeout(function() { callback(null, 'foo'); callback(null, 'foo'); }, 100); }
describe('cb(callback)', function() {
it('should invoke the provided callback', function(done) { invokeAsync(cb(function(err, res) { assert.strictEqual(res, 'foo'); done(); })); });
it('shouldn\'t mess with errors', function(done) { invokeAsyncError(cb(function(err, res) { assert(err); done(); })); });
it('should allow multiple executions', function(done) { var count = 0; invokeAsyncTwice(cb(function(err, res) { count++; if (count === 2) done(); })); });
});
describe('cb(callback).timeout(ms)', function() { it('should complete successfully within timeout period', function(done) { invokeAsync(cb(function(err, res) { assert.strictEqual(res, 'foo'); done(); }).timeout(200)); });
it('should complete with an error after timeout period', function(done) { invokeAsync(cb(function(err, res) { assert(err); done(); }).timeout(50)); });
it('error resulting from a timeout should be instanceof cb.TimeoutError', function(done) { invokeAsync(cb(function(err, res) { assert(err instanceof cb.TimeoutError); done(); }).timeout(50)); });
});
describe('cb(callback).error(errback)', function() {
it('should skip the err argument when invoking callback', function(done) { invokeAsync(cb(function(res) { assert.strictEqual(res, 'foo'); done(); }).error(assert.ifError)); });
it('should pass errors to provided errback', function(done) { invokeAsyncError(cb(function(res) { throw new Error('should not be invoked'); }).error(function(err) { assert(err); done(); })); });
});
describe('cb(callback).error(errback).timeout(ms)', function() {
it('should skip the err argument when invoking callback', function(done) { invokeAsync(cb(function(res) { assert.strictEqual(res, 'foo'); done(); }).error(assert.ifError).timeout(200)); });
it('should pass timeout error to provided errback', function(done) { invokeAsyncError(cb(function(res) { throw new Error('should not be invoked'); }).error(function(err) { assert(err); done(); }).timeout(50)); });
});
describe('cb(callback).once()', function() {
it('should allow multiple executions', function(done) { var count = 0; invokeAsyncTwice(cb(function(err, res) { count++; assert.notEqual(count, 2); setTimeout(done, 100); }).once()); });
});
|