Skip to content

Commit

Permalink
Add tests for autoRetryOnRejection util
Browse files Browse the repository at this point in the history
  • Loading branch information
kyarik committed Nov 28, 2020
1 parent c7bebd4 commit 6562e40
Showing 1 changed file with 91 additions and 0 deletions.
91 changes: 91 additions & 0 deletions src/utils/promise/autoRetryOnRejection/index.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import { autoRetryOnRejection } from '.';

const aSuccessLoader = () => {
const result = { success: true };
const promise = Promise.resolve(result);
const loader = jest.fn(() => promise);

return {
result,
loader,
};
};

const anErrorThenSuccessLoader = () => {
const result = { success: true };
const error = new Error('Failed to load');
const resolvedPromise = Promise.resolve(result);
const rejectedPromise = Promise.reject(error);
const loader = jest.fn(() => resolvedPromise);

loader.mockReturnValueOnce(rejectedPromise);

return {
result,
error,
loader,
};
};

beforeEach(() => jest.useFakeTimers());

it('does not auto-retry if the promise resolves the first time', async () => {
const { loader, result } = aSuccessLoader();

const promise = autoRetryOnRejection(loader);

const value = await promise;

expect(value).toBe(result);
expect(loader).toHaveBeenCalledTimes(1);
});

it('auto-retries if the promise rejects', async () => {
const { loader, result } = anErrorThenSuccessLoader();

const promise = autoRetryOnRejection(loader);

// Allow the loader promise to reject
await Promise.resolve();

jest.advanceTimersByTime(2000);

await Promise.resolve();

expect(loader).toHaveBeenCalledTimes(1);

jest.advanceTimersByTime(1000);

await Promise.resolve();

expect(loader).toHaveBeenCalledTimes(2);

const value = await promise;

expect(value).toBe(result);
});

it('auto-retries respecting the passed timeoutMs', async () => {
const { loader, result } = anErrorThenSuccessLoader();

const promise = autoRetryOnRejection(loader, { timeoutMs: 10000 });

// Allow the loader promise to reject and set the timer
await Promise.resolve();

jest.advanceTimersByTime(5000);

await Promise.resolve();

expect(loader).toHaveBeenCalledTimes(1);

jest.advanceTimersByTime(5000);

await Promise.resolve();

expect(loader).toHaveBeenCalledTimes(2);

const value = await promise;

expect(value).toBe(result);
});

0 comments on commit 6562e40

Please sign in to comment.