From 6562e40cf91be7cb3ccaaef9943d71998e434da9 Mon Sep 17 00:00:00 2001 From: Yaroslav Kukytsyak Date: Sat, 28 Nov 2020 16:57:14 +0100 Subject: [PATCH] Add tests for autoRetryOnRejection util --- .../autoRetryOnRejection/index.test.ts | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/utils/promise/autoRetryOnRejection/index.test.ts diff --git a/src/utils/promise/autoRetryOnRejection/index.test.ts b/src/utils/promise/autoRetryOnRejection/index.test.ts new file mode 100644 index 0000000..eb5b823 --- /dev/null +++ b/src/utils/promise/autoRetryOnRejection/index.test.ts @@ -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); +});