const chai = require('chai') const sinon = require('sinon') const expect = chai.expect chai.use(require('chai-as-promised')) chai.use(require('sinon-chai')) var P = require('../../src/util/promise.js') describe('util/promise', function () { describe('.anySeries()', function () { it('should resolve in series', function () { var spy1 = sinon.spy() var spy2 = sinon.spy() return P .anySeries( ['first', 'second'], (item, idx) => new Promise(function (resolve, reject) { if (idx === 0) { setTimeout(function () { spy1() reject(new Error('first cb')) }, 10) } else { spy2() resolve('foo') } })) .then(() => expect(spy2).to.have.been.calledAfter(spy1)) }) it('should reject when all rejected', function () { var p = P.anySeries(['first', 'second', 'third'], item => Promise.reject(new Error(item))) return expect(p).to.be.rejectedWith('third') }) it('should resolve the value that first callback resolved', () => { var p = P.anySeries(['first', 'second'], item => Promise.resolve(item)) return expect(p).to.eventually.equal('first') }) it('should not call rest of callbacks once resolved', () => { var spy = sinon.spy() return P .anySeries(['first', 'second'], (item, idx) => { if (idx > 0) { spy() } return Promise.resolve(item) }) .then(() => expect(spy).to.not.have.been.called) }) }) describe('.mapSeries()', function () { it('should resolve when all resolved', function () { var p = P.mapSeries(['first', 'second', 'third'], item => Promise.resolve(item)) return expect(p).to.eventually.deep.equal(['first', 'second', 'third']) }) it('should reject with the error that first callback rejected', () => { var p = P.mapSeries(['first', 'second'], item => Promise.reject(item)) return expect(p).to.rejectedWith('first') }) it('should resolve in series', function () { var spy1 = sinon.spy() var spy2 = sinon.spy() return P .mapSeries( ['first', 'second'], (item, idx) => new Promise(function (resolve, reject) { if (idx === 0) { setTimeout(function () { spy1() resolve('first cb') }, 10) } else { spy2() resolve('foo') } })) .then(() => expect(spy2).to.have.been.calledAfter(spy1)) }) it('should not call rest of callbacks once rejected', () => { var spy = sinon.spy() return P .mapSeries(['first', 'second'], (item, idx) => { if (idx > 0) { spy() } return Promise.reject(new Error(item)) }) .catch(() => expect(spy).to.not.have.been.called) }) }) })