/* jshint expr:true */ /* global describe:true, beforeEach:true, afterEach:true, it:true */ var async = require('../lib/async') var should = require('should') var sinon = require('sinon') describe('Async helper', function () { var err = {} var val = {} var ch var fn beforeEach(function () { ch = sinon.stub().returns(function (cb) { cb() }) fn = sinon.stub().yields(err, val) }) it( 'should return a function with an arity of 1', function () { var thunk = async(ch, fn) thunk.should.be.a.Function thunk.length.should.be.exactly(1) } ) it( 'should call fn with args plus a callback', function () { async(ch, fn, 1, 2, 3, 'foo') var argsWithoutCb = fn.firstCall.args.slice(0, -1) argsWithoutCb.should.eql([1, 2, 3, 'foo']) } ) it( 'should call a method of an object with the third argument as the name', function () { var ob = { foo: fn } async(ch, ob, 'foo', 1, 2, 3) var argsWithoutCb = fn.firstCall.args.slice(0, -1) argsWithoutCb.should.eql([1, 2, 3]) fn.firstCall.calledOn(ob).should.be.true } ) it( 'should call channel with arguments of the async function callback', function () { async(ch, fn) ch.firstCall.args.length.should.be.exactly(2) ch.firstCall.args[0].should.be.exactly(err) ch.firstCall.args[1].should.be.exactly(val) } ) it( 'should call callback given to returned function', function (done) { var cb = sinon.spy() async(ch, fn)(cb) setImmediate(function () { cb.callCount.should.be.exactly(1) done() }) } ) })