UNPKG

if-async

Version:

async conditional execution for async.js or standalone usage

538 lines (489 loc) 12.6 kB
var ifAsync = require('./index.js') var should = require('should') describe('ifAsync', function() { it('requires at least one predicate', function () { (function () { ifAsync() }).should.throw('at least one predicate and one consequent are required') }) it('throws an error if at least one consequent is not provided', function () { (function () { ifAsync(function (callback) { callback(null, true) })(function () { }) }).should.throw('missing at least one consequent, you forgot to call then() ?') }) it('invokes the predicate', function (done) { var predicateInvoked = false var functor = ifAsync( function predicate(callback) { predicateInvoked = true callback(null, 1) }, function consequent(callback) { callback() } ) functor(function callback(err) { predicateInvoked.should.be.true done() }) }) it('invokes the consequent if the predicate evaluates to "true"', function (done) { var consequentInvoked = false var functor = ifAsync( function predicate(callback) { callback(null, 1) }, function consequent(callback) { consequentInvoked = true callback() } ) functor(function callback(err) { consequentInvoked.should.be.true done() }) }) it('invokes the default consequent if predicate evaluates to "false"', function (done) { var consequentInvoked = false var defaultConsequentInvoked = false var functor = ifAsync( function predicate(callback) { callback(null, 0) }, function consequent(callback) { consequentInvoked = true callback() }, function defaultConsequent(callback) { defaultConsequentInvoked = true callback() } ) functor(function callback(err) { consequentInvoked.should.be.false defaultConsequentInvoked.should.be.true done() }) }) it('invokes a second predicate if it is provided when the first predicate does not evaluate to true', function (done) { var p1Invoked = false var p2Invoked = false var c1Invoked = false var c2Invoked = false var functor = ifAsync( function predicate1(callback) { p1Invoked = true callback(null, 0) }, function consequent1(callback) { c1Invoked = true callback() }, function predicate2(callback) { p2Invoked = true callback(null, 1) }, function consequent2(callback) { c2Invoked = true callback() } ) functor(function (err) { p1Invoked.should.be.true c1Invoked.should.be.false p2Invoked.should.be.true c2Invoked.should.be.true done() }) }) it('has fluent interface', function (done) { var p1Invoked = false var p2Invoked = false var c1Invoked = false var c2Invoked = false var functor = ifAsync(function predicate1(callback) { p1Invoked = true callback(null, 0) }) .then(function consequent1(callback) { c1Invoked = true callback() }) .elseIf(function predicate2(callback) { p2Invoked = true callback(null, 1) }) .then(function consequent2(callback) { c2Invoked = true callback() }) functor(function (err) { p1Invoked.should.be.true c1Invoked.should.be.false p2Invoked.should.be.true c2Invoked.should.be.true done() }) }) it('cannot call elseIf() after elseIf()', function () { (function () { ifAsync(pFalse).then(foo).elseIf(pFalse).elseIf(pFalse) }).should.throw('only then() may be called after elseIf()') }) describe('has an and() operator', function () { it('ifAsync(true).and(false) should invoke both predicates and the else consequent', function (done) { var p1Invoked = false var p2Invoked = false var c1Invoked = false var c2Invoked = false ifAsync(function(callback) { p1Invoked = true callback(null, true) }) .and(function (callback) { p2Invoked = true callback(null, false) }).then(function(cb) { c1Invoked = true cb() }).else(function (cb) { c2Invoked = true cb() })(function (err) { p1Invoked.should.be.true p2Invoked.should.be.true c1Invoked.should.be.false c2Invoked.should.be.true done() }) }) it('ifAsync(false).and(*) should invoke the first predicate and the second (else) consequent, it should not invoke the second predicate', function(done) { var p1Invoked = false var p2Invoked = false var c1Invoked = false var c2Invoked = false ifAsync(function(callback) { p1Invoked = true callback(null, false) }) .and(function (callback) { p2Invoked = true callback(null, true) }).then(function(cb) { c1Invoked = true cb() }).else(function (cb) { c2Invoked = true cb() })(function (err) { p1Invoked.should.be.true p2Invoked.should.be.false c1Invoked.should.be.false c2Invoked.should.be.true done() }) }) it('ifAsync(true).and(true) should invoke both predicates and the first (then) consequent', function(done) { var p1Invoked = false var p2Invoked = false var c1Invoked = false var c2Invoked = false ifAsync(function(callback) { p1Invoked = true callback(null, true) }) .and(function (callback) { p2Invoked = true callback(null, true) }).then(function(cb) { c1Invoked = true cb() }).else(function (cb) { c2Invoked = true cb() })(function (err) { p1Invoked.should.be.true p2Invoked.should.be.true c1Invoked.should.be.true c2Invoked.should.be.false done() }) }) it('ifAsync(p1 = false).then(c1).elseif(p2 = true).and(p3 = true).then(c2) should not invoke c1 and should invoke p1, p2 and p3', function(done) { var c1Invoked = false var c2Invoked = false var p1Invoked = false var p2Invoked = false var p3Invoked = false ifAsync(function p1(callback) { p1Invoked = true callback(null, false) }).then(function c1(callback) { c1Invoked = true callback() }).elseif(function p2(callback) { p2Invoked = true callback(null, true) }).and(function p3(callback) { p3Invoked = true callback(null, true) }).then(function c2(callback) { c2Invoked = true callback() })(function(err) { p1Invoked.should.be.true c1Invoked.should.be.false p2Invoked.should.be.true p3Invoked.should.be.true c2Invoked.should.be.true done() }) }) it('ifAsync(p1 = true).and.not(p2 = false).then(c1), should invoke p1 and p2 and c1 and not c2', function (done) { var c1Invoked = false var c2Invoked = false var p1Invoked = false var p2Invoked = false ifAsync(function p1(callback) { p1Invoked = true callback(null, true) }).and.not(function p2(callback) { p2Invoked = true callback(null, false) }).then(function c1(callback) { c1Invoked = true callback() }).else(function c2 (callback) { c2Invoked = true callback() })(function(err) { p1Invoked.should.be.true p2Invoked.should.be.true c1Invoked.should.be.true c2Invoked.should.be.false done() }) }) }) describe('has an or() operator', function () { it('ifAsync(true).or(*) should invoke the first predicate and the first (then) consequent, it should not invoke the second predicate', function (done) { var p1Invoked = false var p2Invoked = false var c1Invoked = false var c2Invoked = false ifAsync(function(callback) { p1Invoked = true callback(null, true) }) .or(function (callback) { p2Invoked = true callback(null, true) }).then(function(cb) { c1Invoked = true cb() }).else(function (cb) { c2Invoked = true cb() })(function (err) { p1Invoked.should.be.true p2Invoked.should.be.false c1Invoked.should.be.true c2Invoked.should.be.false done() }) }) it('ifAsync(false).or(true) should invoke both predicates and the first (then) consequent', function (done) { var p1Invoked = false var p2Invoked = false var c1Invoked = false var c2Invoked = false ifAsync(function(callback) { p1Invoked = true callback(null, false) }) .or(function (callback) { p2Invoked = true callback(null, true) }).then(function(cb) { c1Invoked = true cb() }).else(function (cb) { c2Invoked = true cb() })(function (err) { p1Invoked.should.be.true p2Invoked.should.be.true c1Invoked.should.be.true c2Invoked.should.be.false done() }) }) it('ifAsync(false).or(false) should invoke both predicates and the second (else) consequent', function (done) { var p1Invoked = false var p2Invoked = false var c1Invoked = false var c2Invoked = false ifAsync(function(callback) { p1Invoked = true callback(null, false) }) .or(function (callback) { p2Invoked = true callback(null, false) }).then(function(cb) { c1Invoked = true cb() }).else(function (cb) { c2Invoked = true cb() })(function (err) { p1Invoked.should.be.true p2Invoked.should.be.true c1Invoked.should.be.false c2Invoked.should.be.true done() }) }) it('ifAsync(p1 = false).then(c1).elseif(p2 = false).or(p3 = true).then(c2) should not invoke c1 and should invoke p1, p2 and p3', function(done) { var c1Invoked = false var c2Invoked = false var p1Invoked = false var p2Invoked = false var p3Invoked = false ifAsync(function p1(callback) { p1Invoked = true callback(null, false) }).then(function c1(callback) { c1Invoked = true callback() }).elseif(function p2(callback) { p2Invoked = true callback(null, false) }).or(function p3(callback) { p3Invoked = true callback(null, true) }).then(function c2(callback) { c2Invoked = true callback() })(function(err) { p1Invoked.should.be.true c1Invoked.should.be.false p2Invoked.should.be.true p3Invoked.should.be.true c2Invoked.should.be.true done() }) }) it('ifAsync(p1 = false).or.not(p2 = false).then(c1), should invoke p1 and p2 and c1 and not c2', function (done) { var c1Invoked = false var c2Invoked = false var p1Invoked = false var p2Invoked = false ifAsync(function p1(callback) { p1Invoked = true callback(null, false) }).or.not(function p2(callback) { p2Invoked = true callback(null, false) }).then(function c1(callback) { c1Invoked = true callback() }).else(function c2 (callback) { c2Invoked = true callback() })(function(err) { p1Invoked.should.be.true p2Invoked.should.be.true c1Invoked.should.be.true c2Invoked.should.be.false done() }) }) }) it('carry arguments from "then" consequent', function (done) { ifAsync(function(a, b, callback) { a.should.eql(1) b.should.eql(2) callback(null, true) }) .then(function(a, b, callback) { a.should.eql(1) b.should.eql(2) callback(null, 3) })(1, 2, function (err, a) { a.should.eql(3) done() }) }) it('carry arguments from default "else" consequent', function (done) { ifAsync(function(a, b, callback) { a.should.eql(1) b.should.eql(2) callback(null, false) }) .then(function(a, b, callback) { a.should.eql(1) b.should.eql(2) callback(null, 3) })(1, 2, function (err, a, b) { a.should.eql(1) b.should.eql(2) done() }) }) it('has a negation operator for predicates', function (done) { var p1Invoked = false var c1Invoked = false var c2Invoked = false ifAsync.not(function p1(callback) { p1Invoked = true callback(null, true) }).then(function c1(callback) { c1Invoked = true callback() }).else(function c2(callback) { c2Invoked = true callback() })(function(err) { p1Invoked.should.be.true c1Invoked.should.be.false c2Invoked.should.be.true done() }) }) it('has a negation operator for predicates 2', function (done) { var p1Invoked = false var p2Invoked = false var c1Invoked = false var c2Invoked = false ifAsync(function p1(callback) { p1Invoked = true callback(null, false) }).then(function c1(callback) { c1Invoked = true callback() }).elseIf.not(function p2(callback) { p2Invoked = true callback(null, false) }).then(function c2(callback) { c2Invoked = true callback() })(function(err) { p1Invoked.should.be.true c1Invoked.should.be.false p2Invoked.should.be.true c2Invoked.should.be.true done() }) }) function pTrue (callback) { callback(null, true) } function pFalse (callback) { callback(null, false) } function foo (callback) { callback() } })