import { mount } from 'enzyme'; import React from 'react'; import { useInterval } from './useInterval.hook'; describe('useInterval hook', () => { beforeEach(() => jasmine.clock().install()); afterEach(() => jasmine.clock().uninstall()); function Component(props: any) { const { callback, interval } = props; useInterval(callback, interval); return <>; } it('calls the callback on the specified interval', () => { const spy = jasmine.createSpy('callback'); const component = mount(); expect(spy).toHaveBeenCalledTimes(0); // Tick forward to slightly before the polling interval should kick in jasmine.clock().tick(900); component.setProps({}); expect(spy).toHaveBeenCalledTimes(0); // Tick forward to past the first interval jasmine.clock().tick(200); component.setProps({}); expect(spy).toHaveBeenCalledTimes(1); // Second interval jasmine.clock().tick(1000); component.setProps({}); expect(spy).toHaveBeenCalledTimes(2); }); it('resets the interval when changed', () => { const spy = jasmine.createSpy('callback'); const component = mount(); expect(spy).toHaveBeenCalledTimes(0); // Tick forward to slightly before the polling interval should kick in jasmine.clock().tick(900); component.setProps({}); expect(spy).toHaveBeenCalledTimes(0); // Change / reset interval component.setProps({ interval: 5000 }); // Tick forward to slightly past the original interval (clock is now at 1200) jasmine.clock().tick(200); component.setProps({}); expect(spy).toHaveBeenCalledTimes(0); // Tick forward to first iteration of new interval jasmine.clock().tick(5000); component.setProps({}); expect(spy).toHaveBeenCalledTimes(1); }); it('does not call a callback when none is provided', () => { const spy = jasmine.createSpy('callback'); const component = mount(); expect(spy).toHaveBeenCalledTimes(0); jasmine.clock().tick(1200); component.setProps({}); expect(spy).toHaveBeenCalledTimes(1); component.setProps({ callback: null }); // Because we got rid of the callback, the hook should stop the interval and // throw away the previous callback jasmine.clock().tick(1200); component.setProps({}); expect(spy).toHaveBeenCalledTimes(1); const newSpy = jasmine.createSpy('newCallback'); component.setProps({ callback: newSpy }); // Passing a new callback after null should restart the interval expect(newSpy).toHaveBeenCalledTimes(0); jasmine.clock().tick(1200); component.setProps({}); expect(newSpy).toHaveBeenCalledTimes(1); }); });