repeat-promise-until-resolved
Version:
A utility for easily repeating a promise-based task, until it succeeds. Works both in Node and in the browser.
177 lines (111 loc) • 3.84 kB
JavaScript
const axios = require('axios');
const {expect} = require('expect')
var MockAdapter = require("axios-mock-adapter");
var mock = new MockAdapter(axios);
const fs = require('fs');
const Path = require('path');
const rimraf = require('rimraf')
const repeatPromiseUntilResolved = require('./index');
describe('General tests', () => {
it('Should fail 3 times and finally fail(using default mAxttempts)', async function () {
mock.onGet("/400").reply(404)
let errorCount = 0;
let finallyFailed = false;
async function promiseFactory() {
const response = await axios('/400')
}
const onError = (e) => {
errorCount++
}
try {
await repeatPromiseUntilResolved(promiseFactory, { onError });
} catch (error) {
finallyFailed = true;
}
expect(errorCount).toBe(3);
expect(finallyFailed).toBe(true);
})
it('Should fail 5 times and finally fail', async function () {
mock.onGet("/500").reply(500)
let errorCount = 0;
let attemptCount = 0;
let finallyFailed = false;
async function promiseFactory() {
const response = await axios('/500')
}
const onError = (e) => {
errorCount++
}
const onAttempt = () => {
attemptCount++
}
try {
await repeatPromiseUntilResolved(promiseFactory, { onError, onAttempt, maxAttempts: 5 });
} catch (error) {
finallyFailed = true;
}
expect(errorCount).toBe(5);
expect(attemptCount).toBe(5);
expect(finallyFailed).toBe(true);
})
it('Should succeed', async () => {
mock.onGet("/200").reply(200)
let success = false;
let attemptCount = 0;
async function promiseFactory() {
const response = await axios('/200')
}
const onAttempt = () => {
attemptCount++
}
await repeatPromiseUntilResolved(promiseFactory, { onAttempt });
success = true;
expect(success).toBe(true);
expect(attemptCount).toBe(1);
})
it('Should create delay', async function () {
this.timeout(0)
const start = Date.now();
mock.onGet("/500").reply(500)
async function promiseFactory() {
const response = await axios('/500')
}
try {
await repeatPromiseUntilResolved(promiseFactory, { delay: 1000, maxAttempts: 3 });
} catch (error) {
}
const end = Date.now();
const dif = end - start;
// console.log(start, end, dif)
expect(dif >= 2000).toBe(true);
// expect(attemptCount).toBe(1);
})
it('Should timeout and finally fail', async function () {
let errorCount = 0;
let finallyFailed = false;
this.timeout(0)
mock.onGet("/200").reply(200)
async function promiseFactory() {
await createDelay(1001);
await axios('/200');
}
const onError = (e) => {
// console.log(e)
errorCount++
}
try {
await repeatPromiseUntilResolved(promiseFactory, {onError, maxAttempts: 3, timeout: 1000 });
} catch (error) {
finallyFailed = true;
}
expect(errorCount).toBe(3);
expect(finallyFailed).toBe(true);
})
})
function createDelay(time = 0) {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, time)
})
}