import { render, waitFor } from '@testing-library/react'; import * as useFixturePageLinkFn from '../useFixturePageLink'; import * as addFixturesPageLinkModule from '../addFixturesPageLink'; import React from 'react'; const classNameForFixtures = 'Opta-Room'; const fixturesPageUrl = 'https://www.thetimes.co.uk/sport/football/euro-2024'; describe('getAndAddFixturesPageLink', () => { jest.spyOn(addFixturesPageLinkModule, 'addFixturesPageLink'); jest.spyOn(useFixturePageLinkFn, 'useFixturePageLink'); beforeEach(() => { document.body.innerHTML = ''; jest.clearAllMocks(); }); it('should call addFixturesPageLink if Opta-Room exists and fixturesPageUrlElement does not exist', () => { document.body.innerHTML = `
`; expect( useFixturePageLinkFn.getAndAddFixturesPageLink( classNameForFixtures, fixturesPageUrl ) ).toBe(true); expect(addFixturesPageLinkModule.addFixturesPageLink).toHaveBeenCalledWith( expect.any(HTMLElement), fixturesPageUrl ); }); it('should not call addFixturesPageLink if Opta-Room does not exist', () => { document.body.innerHTML = ''; expect( useFixturePageLinkFn.getAndAddFixturesPageLink( classNameForFixtures, fixturesPageUrl ) ).toBe(false); expect( addFixturesPageLinkModule.addFixturesPageLink ).not.toHaveBeenCalled(); }); it('should not call addFixturesPageLink if fixturesPageUrlElement exists', () => { document.body.innerHTML = `
`; expect( useFixturePageLinkFn.getAndAddFixturesPageLink( classNameForFixtures, fixturesPageUrl ) ).toBe(false); expect( addFixturesPageLinkModule.addFixturesPageLink ).not.toHaveBeenCalled(); }); it('should call addFixturesPageLink if fixturesPageUrlElement does not exist but Opta-Room does', () => { document.body.innerHTML = `
`; expect( useFixturePageLinkFn.getAndAddFixturesPageLink( classNameForFixtures, fixturesPageUrl ) ).toBe(true); expect(addFixturesPageLinkModule.addFixturesPageLink).toHaveBeenCalled(); }); }); describe('useFixturePageLink', () => { let ref: any; jest.spyOn(addFixturesPageLinkModule, 'addFixturesPageLink'); jest.spyOn(useFixturePageLinkFn, 'useFixturePageLink'); beforeEach(() => { document.body.innerHTML = ''; jest.clearAllMocks(); ref = { current: document.createElement('div') }; }); const TestComponent = ({ container, pageUrl }: { container: string; isDarkMode: boolean; pageUrl: string; }) => { useFixturePageLinkFn.useFixturePageLink(ref, container, pageUrl); return (
); }; it('should call getAndAddFixturesPageLink on mount', () => { render( ); jest.advanceTimersByTime(3000); expect(addFixturesPageLinkModule.addFixturesPageLink).toHaveBeenCalled(); }); it('should have link appended to the end', async () => { render( ); jest.advanceTimersByTime(3000); await waitFor(() => { const elements = document.getElementsByClassName(classNameForFixtures); expect(elements.length).toBe(1); const transformedElements = Array.from(elements); const appendedLink = transformedElements[ transformedElements.length - 1 ].querySelector('.fixtures-page-link a') as HTMLAnchorElement; expect(appendedLink).toBeInstanceOf(HTMLAnchorElement); expect(appendedLink.href).toBe(fixturesPageUrl); expect( (appendedLink.querySelector('span') as HTMLElement).textContent ).toBe('Full Fixtures & Results'); }); }); it('should retry adding fixture link inside setInterval', () => { const TestComponentMaxRetries = ({ container, pageUrl }: { container: string; pageUrl: string; }) => { useFixturePageLinkFn.useFixturePageLink(ref, container, pageUrl); return
; }; jest .spyOn(useFixturePageLinkFn, 'getAndAddFixturesPageLink') .mockReturnValue(false); jest.useFakeTimers(); jest.spyOn(global, 'setInterval'); render( ); expect(setInterval).toHaveBeenCalledTimes(1); jest.advanceTimersByTime(6000); expect( useFixturePageLinkFn.getAndAddFixturesPageLink ).toHaveBeenCalledTimes(31); // 1 initial + 30 retries jest.useRealTimers(); }); });