123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- 'use strict';
-
- var expect = require('expect.js');
- var promiseRetry = require('../');
- var promiseDelay = require('sleep-promise');
-
- describe('promise-retry', function () {
- it('should call fn again if retry was called', function () {
- var count = 0;
-
- return promiseRetry(function (retry) {
- count += 1;
-
- return promiseDelay(10)
- .then(function () {
- if (count <= 2) {
- retry(new Error('foo'));
- }
-
- return 'final';
- });
- }, { factor: 1 })
- .then(function (value) {
- expect(value).to.be('final');
- expect(count).to.be(3);
- }, function () {
- throw new Error('should not fail');
- });
- });
-
- it('should call fn with the attempt number', function () {
- var count = 0;
-
- return promiseRetry(function (retry, number) {
- count += 1;
- expect(count).to.equal(number);
-
- return promiseDelay(10)
- .then(function () {
- if (count <= 2) {
- retry(new Error('foo'));
- }
-
- return 'final';
- });
- }, { factor: 1 })
- .then(function (value) {
- expect(value).to.be('final');
- expect(count).to.be(3);
- }, function () {
- throw new Error('should not fail');
- });
- });
-
- it('should not retry on fulfillment if retry was not called', function () {
- var count = 0;
-
- return promiseRetry(function () {
- count += 1;
-
- return promiseDelay(10)
- .then(function () {
- return 'final';
- });
- })
- .then(function (value) {
- expect(value).to.be('final');
- expect(count).to.be(1);
- }, function () {
- throw new Error('should not fail');
- });
- });
-
- it('should not retry on rejection if retry was not called', function () {
- var count = 0;
-
- return promiseRetry(function () {
- count += 1;
-
- return promiseDelay(10)
- .then(function () {
- throw new Error('foo');
- });
- })
- .then(function () {
- throw new Error('should not succeed');
- }, function (err) {
- expect(err.message).to.be('foo');
- expect(count).to.be(1);
- });
- });
-
- it('should not retry on rejection if nr of retries is 0', function () {
- var count = 0;
-
- return promiseRetry(function (retry) {
- count += 1;
-
- return promiseDelay(10)
- .then(function () {
- throw new Error('foo');
- })
- .catch(retry);
- }, { retries : 0 })
- .then(function () {
- throw new Error('should not succeed');
- }, function (err) {
- expect(err.message).to.be('foo');
- expect(count).to.be(1);
- });
- });
-
- it('should reject the promise if the retries were exceeded', function () {
- var count = 0;
-
- return promiseRetry(function (retry) {
- count += 1;
-
- return promiseDelay(10)
- .then(function () {
- throw new Error('foo');
- })
- .catch(retry);
- }, { retries: 2, factor: 1 })
- .then(function () {
- throw new Error('should not succeed');
- }, function (err) {
- expect(err.message).to.be('foo');
- expect(count).to.be(3);
- });
- });
-
- it('should pass options to the underlying retry module', function () {
- var count = 0;
-
- return promiseRetry(function (retry) {
- return promiseDelay(10)
- .then(function () {
- if (count < 2) {
- count += 1;
- retry(new Error('foo'));
- }
-
- return 'final';
- });
- }, { retries: 1, factor: 1 })
- .then(function () {
- throw new Error('should not succeed');
- }, function (err) {
- expect(err.message).to.be('foo');
- });
- });
-
- it('should convert direct fulfillments into promises', function () {
- return promiseRetry(function () {
- return 'final';
- }, { factor: 1 })
- .then(function (value) {
- expect(value).to.be('final');
- }, function () {
- throw new Error('should not fail');
- });
- });
-
- it('should convert direct rejections into promises', function () {
- promiseRetry(function () {
- throw new Error('foo');
- }, { retries: 1, factor: 1 })
- .then(function () {
- throw new Error('should not succeed');
- }, function (err) {
- expect(err.message).to.be('foo');
- });
- });
-
- it('should not crash on undefined rejections', function () {
- return promiseRetry(function () {
- throw undefined;
- }, { retries: 1, factor: 1 })
- .then(function () {
- throw new Error('should not succeed');
- }, function (err) {
- expect(err).to.be(undefined);
- })
- .then(function () {
- return promiseRetry(function (retry) {
- retry();
- }, { retries: 1, factor: 1 });
- })
- .then(function () {
- throw new Error('should not succeed');
- }, function (err) {
- expect(err).to.be(undefined);
- });
- });
-
- it('should retry if retry() was called with undefined', function () {
- var count = 0;
-
- return promiseRetry(function (retry) {
- count += 1;
-
- return promiseDelay(10)
- .then(function () {
- if (count <= 2) {
- retry();
- }
-
- return 'final';
- });
- }, { factor: 1 })
- .then(function (value) {
- expect(value).to.be('final');
- expect(count).to.be(3);
- }, function () {
- throw new Error('should not fail');
- });
- });
-
- it('should work with several retries in the same chain', function () {
- var count = 0;
-
- return promiseRetry(function (retry) {
- count += 1;
-
- return promiseDelay(10)
- .then(function () {
- retry(new Error('foo'));
- })
- .catch(function (err) {
- retry(err);
- });
- }, { retries: 1, factor: 1 })
- .then(function () {
- throw new Error('should not succeed');
- }, function (err) {
- expect(err.message).to.be('foo');
- expect(count).to.be(2);
- });
- });
-
- it('should allow options to be passed first', function () {
- var count = 0;
-
- return promiseRetry({ factor: 1 }, function (retry) {
- count += 1;
-
- return promiseDelay(10)
- .then(function () {
- if (count <= 2) {
- retry(new Error('foo'));
- }
-
- return 'final';
- });
- }).then(function (value) {
- expect(value).to.be('final');
- expect(count).to.be(3);
- }, function () {
- throw new Error('should not fail');
- });
- });
- });
|