UNPKG

seq-prom

Version:

A small library to allow for sequential operations on an array using Promises

400 lines (376 loc) 10.6 kB
/** * Created by adrianbrowning on 01/12/2016. */ module.exports = (SeqProm) => { test('All items resolve - List', function (done) { const cb = jest.fn((i, r) => r(i)), errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3 ], cb, errorCB, finalCB() { expect(cb).toHaveBeenCalledTimes(3); expect(errorCB).toHaveBeenCalledTimes(0); return done(); }, }).start(); }); test('All items resolve - Batch', function (done) { const cb = jest.fn((i, r) => setTimeout(() => r(i), i)), errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], batchSize: 3, cb, errorCB, finalCB() { expect(cb).toHaveBeenCalledTimes(9); expect(errorCB).toHaveBeenCalledTimes(0); return done(); } }).start(); }); test('All items resolve - Streaming', function (done) { const cb = jest.fn((i, r) => setTimeout(() => r(i), i)), errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ], poolSize: 3, cb, errorCB, finalCB() { expect(cb).toHaveBeenCalledTimes(15); expect(errorCB).toHaveBeenCalledTimes(0); return done(); }, }).start(); }); test('One item fail resolve', function (done) { const cb = jest.fn((i, r, re) => setTimeout(() => {if (i === 3) {re("Too Big")} else {r(i)}}, i)), errorCB = jest.fn((i, msg) => { expect(i).toEqual(3); expect(msg).toEqual('Too Big') }); SeqProm({ list: [ 1, 2, 3 ], cb, errorCB, finalCB() { expect(cb).toHaveBeenCalledTimes(3); expect(errorCB).toHaveBeenCalledTimes(1); return done(); }, }).start(); }); test('Stop before complete - list', function (done) { const cb = jest.fn((i, r, re, self) => { setTimeout(() => r(i), i); self.stop() }), errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3 ], cb, errorCB, finalCB() { expect(cb).toHaveBeenCalledTimes(1); expect(errorCB).toHaveBeenCalledTimes(0); return done(); }, }).start(); }); test('Stop before complete - batch', function (done) { const cb = jest.fn((i, r, re, self) => { setTimeout(() => r(i), i); self.stop() }), errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], batchSize: 3, useBatch: true, cb, errorCB, finalCB() { expect(cb).toHaveBeenCalledTimes(3); expect(errorCB).toHaveBeenCalledTimes(0); return done(); }, }).start(); }); test('Stop before complete - stream', function (done) { const cb = jest.fn((i, r, re, self) => { setTimeout(() => r(i), i); self.stop() }), errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3, 1, 2, 3, 1, 2, 3 ], poolSize: 3, cb, errorCB, finalCB() { expect(cb).toHaveBeenCalledTimes(1); expect(errorCB).toHaveBeenCalledTimes(0); return done(); }, }).start(); }); test('Data pass through - list', function (done) { const errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3 ], cb(item, resolve, reject) { setTimeout(function () { if (item % 2) return resolve(item); return reject(item); }, item); }, errorCB, finalCB(errors, responses) { expect(errorCB).toHaveBeenCalledTimes(1); expect(errors.length).toBe(1); expect(responses.length).toBe(2); return done(); }, }).start(); }); test('Data pass through - batch', function (done) { const errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3, 1, 2, 3, 1, 2, 3 ], batchSize: 3, useBatch: true, cb(item, resolve, reject) { setTimeout(function () { if (item % 3) return resolve(item); return reject(item); }, item); }, errorCB, finalCB(errors, responses) { expect(errorCB).toHaveBeenCalledTimes(3); expect(errors.length).toBe(3); expect(responses.length).toBe(6); return done(); }, }).start(); }); test('Data pass through - streaming', function (done) { const errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ], poolSize: 3, cb(item, resolve, reject) { setTimeout(function () { if (item % 3) return resolve(item); return reject(item); }, item); }, errorCB, finalCB(errors, responses) { expect(errorCB).toHaveBeenCalledTimes(5); expect(errors.length).toBe(5); expect(responses.length).toBe(10); return done(); }, }).start(); }); test('Auto Start', function (done) { const errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3 ], autoStart: true, cb(item, resolve, reject) { setTimeout(function () { if (item % 2) return resolve(item); return reject(item); }, item); }, errorCB, finalCB(errors, responses) { expect(errorCB).toHaveBeenCalledTimes(1); expect(errors.length).toBe(1); expect(responses.length).toBe(2); return done(); }, }); }); test('No Callbacks', function (done) { const cb = jest.fn((item, resolve, reject) => { setTimeout(function () { if (item % 2) return resolve(item); return reject(item); }, item); }); SeqProm({ list: [ 1, 2, 3 ], autoStart: true, cb, }).promise.then(_ => { expect(cb).toHaveBeenCalledTimes(3); return done(); }); }); test('Return promise - List', function (done) { const cb = jest.fn((i, r, re, self) => {setTimeout(() => r(i), i)}), errorCB = jest.fn(), finalCB = jest.fn(); SeqProm({ list: [ 1, 2, 3 ], cb, errorCB, finalCB, }).start().promise.then(_ => { expect(cb).toHaveBeenCalledTimes(3); expect(errorCB).toHaveBeenCalledTimes(0); expect(finalCB).toHaveBeenCalledTimes(1); done(); }); }); test('Return promise - Batch', function (done) { const cb = jest.fn((i, r, re, self) => {setTimeout(() => r(i), i)}), errorCB = jest.fn(), finalCB = jest.fn(); SeqProm({ list: [ 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3 ], batchSize: 3, useBatch: true, cb, errorCB, finalCB, }).start().promise.then(_ => { expect(cb).toHaveBeenCalledTimes(12); expect(errorCB).toHaveBeenCalledTimes(0); expect(finalCB).toHaveBeenCalledTimes(1); done(); }); }); test('Return promise - Streaming', function (done) { const cb = jest.fn((i, r, re, self) => {setTimeout(() => r(i), i)}), errorCB = jest.fn(), finalCB = jest.fn(); SeqProm({ list: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ], poolSize: 3, cb, errorCB, finalCB, }).start().promise.then(_ => { expect(cb).toHaveBeenCalledTimes(15); expect(errorCB).toHaveBeenCalledTimes(0); expect(finalCB).toHaveBeenCalledTimes(1); done(); }); }); test("Final Callback error & responses list", function (done) { const cb = jest.fn((i, r, re, self) => {setTimeout(() => i !== 3 ? r(i): re(i), i)}), errorCB = jest.fn(); SeqProm({ list: [ 1, 2, 3 ], autoStart: true, cb, errorCB, finalCB(errors, responses) { expect(cb).toHaveBeenCalledTimes(3); expect(errorCB).toHaveBeenCalledTimes(1); expect(errors.length).toBe(1); expect(responses.length).toBe(2); expect(errors).toEqual(expect.arrayContaining([ { item: 3, reason: 3 } ])); expect(responses).toEqual(expect.arrayContaining([ 1, 2 ])); console.log("All done!"); done(); } }) }); test("Chained Then Callback error & responses list", function (done) { const cb = jest.fn((i, r, re, self) => {setTimeout(() => i !== 3 ? r(i): re(i), i)}), errorCB = jest.fn(), finalCB = jest.fn(); SeqProm({ list: [ 1, 2, 3 ], autoStart: true, cb, errorCB, finalCB, }) .promise .then(([ errors, responses ]) => { expect(cb).toHaveBeenCalledTimes(3); expect(errorCB).toHaveBeenCalledTimes(1); expect(finalCB).toHaveBeenCalledTimes(1); expect(errors.length).toBe(1); expect(responses.length).toBe(2); expect(errors).toEqual(expect.arrayContaining([ { item: 3, reason: 3 } ])); expect(responses).toEqual(expect.arrayContaining([ 1, 2 ])); console.log(errors.length, responses.length); done(); }); }); test("Run 2 at once", function (done) { const error1 = jest.fn(), callBack1 = jest.fn((i, r) => { expect(i).toBe(1); r() }), error2 = jest.fn(), callBack2 = jest.fn((i, r) => { expect(i).toBe(2); r() }); SeqProm({ list: [ 1, 1, 1 ], cb: callBack1, errorCB: error1, autoStart: true, finalCB() { try { expect(callBack1).toHaveBeenCalledTimes(3); expect(error1).toHaveBeenCalledTimes(0); } catch (e) { return done(e); } return done(); }, }); SeqProm({ list: [ 2, 2, 2 ], cb: callBack2, errorCB: error2, autoStart: true, finalCB() { try { expect(callBack2).toHaveBeenCalledTimes(3); expect(error2).toHaveBeenCalledTimes(0); } catch (e) { return done(e); } return done(); }, }); }); // test("No resolve called", function (done) { // const errorCB = jest.fn(), // cb = jest.fn((i, r) => { // expect(i).toBe(1); // }); // SeqProm({ // list: [ 1, 1, 1 ], // cb, // errorCB, // autoStart: true, // finalCB() { // try { // expect(cb).toHaveBeenCalledTimes(3); // expect(errorCB).toHaveBeenCalledTimes(0); // } // catch (e) { // return done(e); // } // return done(); // }, // }); // }); };