// Adapted from https://github.com/bluzi/jest-retries/blob/01a9713a7379edcfd2d1bccec7c0fbc66d4602da/src/retry.js // We explicitly reference the jest typings since the jest.d.ts file shipped // with jest 26 masks the @types/jest typings /// import { sleep } from './common'; /** * Run a test function. * * @param fn The function of the test */ async function runTest(fn: any): Promise { return new Promise((resolve, reject) => { const result = fn((err: Error) => (err ? reject(err) : resolve())); if (result && result.then) { result.catch(reject).then(resolve); } else { resolve(); } }); } /** * Run a flaky test with retries. * * @param name The name of the test * @param fn The function of the test * @param retries The number of retries * @param wait The time to wait in milliseconds between retries */ /* eslint-disable jest/no-export */ export function flakyIt(name: string, fn: any, retries = 3, wait = 1000): void { test(name, async () => { let latestError; for (let tries = 0; tries < retries; tries++) { try { await runTest(fn); return; } catch (error) { latestError = error; await sleep(wait); } } throw latestError; }); } /* eslint-enable jest/no-export */ flakyIt.only = it.only; flakyIt.skip = it.skip; flakyIt.todo = it.todo;