callback-hell
Version:
my abstraction for dealing with async functions that must run sequentially or can run in parallel
97 lines (88 loc) • 3.1 kB
JavaScript
var rfr = require('rfr');
var h = rfr('hell');
var _ = require('underscore');
var assert = require('chai').assert;
describe("callback-hell", function() {
it( "asyncSerial runs each async function in a consecutive manner and dumps the channel on completion", function() {
var fns = [
function(_r,cb) { cb( h.mkResult(h.mkWriteOrder('foo',1))); },
function(re,cb) {
if(re.get("foo") === 1)
cb(h.mkNull());
else
cb(h.mkError("blah"));
},
function(re,cb) { cb( h.mkResult(h.mkWriteOrder('bar',2))); },
function(re,cb) {
if(re.get("foo") === 1 && re.get("bar") === 2)
cb(h.mkNull());
else
cb(h.mkError("blah"));
},
];
h.asyncSerial(fns,function(w) {
assert(h.isResult(w));
assert('foo' in w.result);
assert('bar' in w.result);
assert( _.keys(w.result).length === 2 );
});
});
it( "asyncSerial runs until an error-value. This is the thing that is passed to the final callback", function() {
var touched = false;
var fns = [
function(_r,cb) { cb(h.mkError('blah')); },
function(_r,cb) { touched = true; cb( h.mkResult(h.mkWriteOrder('foo',1))); }
];
h.asyncSerial(fns, function(w) {
assert(h.isError(w));
assert(!touched);
});
});
it( "mapWrap works as expected", function() {
var cb = function(w) { assert(w.result === true); };
var mcb = h.mw(cb, function(_) { return true; });
mcb( h.mkResult( false ));
});
it( "asyncParallel runs async functions dumps the channel on completion", function() {
var range = _.range(0,30);
var fns = _.chain(range)
.map( function(x) { return function(cb) { cb(h.mkResult(h.mkWriteOrder(x,x))); }; } )
.value();
h.asyncParallel(fns, function(w) {
assert(h.isResult(w));
_.each(range, function(x) { assert( x === w.result[x] ); });
});
});
it( "asyncParallel returns error value when a single function errors", function() {
var range = _.range(0,30);
var fns = _.chain(range)
.map( function(x) { return function(cb) { cb( x === 0 ? h.mkError('') : h.mkResult(h.mkWriteOrder(x,x))); }; } )
.value();
h.asyncParallel(fns,function(w) {
assert(h.isError(w));
});
});
it( "mapArr works properly", function() {
var range = _.range(0,5);
var fn = function(x,cb) {
h.rw(cb)( x * 2 );
};
h.asyncSerialArr( range, function(w) {
_.each( w.result, function(x,i) {
assert( x === i * 2 );
});
});
});
it( "mapObj works properly", function() {
var range = _.range(0,2);
range = _.object( _.zip( range, range ));
var fn = function(k,v,cb) {
h.rw(cb)( k + v );
};
h.asyncParallelObj( range, function(w) {
_.each( w.result, function(k,v) {
assert( v === k * 2 );
});
});
});
});