// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import React from 'react'; import { useAsyncInterval } from './use-async-interval'; import { configure, mount } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import FakeTimers from "@sinonjs/fake-timers"; configure({ adapter: new Adapter() }); const clock = FakeTimers.install(); jest.mock('react', () => { const originalReact = jest.requireActual('react'); const mUseRef = jest.fn(); return { ...originalReact, useRef: mUseRef, }; }); const TestComponent = (props): JSX.Element => { useAsyncInterval(props.callback, 2000); return ; }; describe('useAsyncInterval', () => { it('should fire repeatedly after the interval', async () => { const mockedReact = React as jest.Mocked; const ref = { current: {} }; mockedReact.useRef.mockReturnValue(ref); const syncCallback = jest.fn(); const testComponent = mount(); // cb queued with interval but not called expect(syncCallback).not.toHaveBeenCalled(); // wait for first tick await clock.tickAsync(2000); expect(syncCallback).toHaveBeenCalledTimes(1); // wait for second tick await clock.tickAsync(2000); expect(syncCallback).toHaveBeenCalledTimes(2); // wait for third tick await clock.tickAsync(2000); expect(syncCallback).toHaveBeenCalledTimes(3); }); it('should wait for async callbacks to complete in between polling', async () => { const mockedReact = React as jest.Mocked; const ref = { current: {} }; mockedReact.useRef.mockReturnValue(ref); const delayedCallback = jest.fn(() => ( new Promise((resolve) => { setTimeout(() => { resolve(); }, 2000); }) )); const testComponent = mount(); // cb queued with setInterval but not called expect(delayedCallback).not.toHaveBeenCalled(); // Wait 2 seconds for first tick await clock.tickAsync(2000); // First cb called after 2 seconds expect(delayedCallback).toHaveBeenCalledTimes(1); // Wait for cb to resolve for 2 seconds await clock.tickAsync(2000); expect(delayedCallback).toHaveBeenCalledTimes(1); // Wait 2 seconds for second tick await clock.tickAsync(2000); expect(delayedCallback).toHaveBeenCalledTimes(2); // Wait for cb to resolve for 2 seconds await clock.tickAsync(2000); expect(delayedCallback).toHaveBeenCalledTimes(2); // Wait 2 seconds for third tick await clock.tickAsync(2000); expect(delayedCallback).toHaveBeenCalledTimes(3); // Wait for cb to resolve for 2 seconds await clock.tickAsync(2000); expect(delayedCallback).toHaveBeenCalledTimes(3); }); });