/** * https://stackoverflow.com/a/58651649 * * Utility function that mocks the `IntersectionObserver` API. Necessary for components that rely * on it, otherwise the tests will crash. Recommended to execute inside `beforeEach`. * @param intersectionObserverMock - Parameter that is sent to the `Object.defineProperty` * overwrite method. `jest.fn()` mock functions can be passed here if the goal is to not only * mock the intersection observer, but its methods. */ function setupIntersectionObserverMock({ root = null, rootMargin = '', thresholds = [], disconnect = () => null, observe = () => null, takeRecords = () => [], unobserve = () => null, } = {}): void { class MockIntersectionObserver implements IntersectionObserver { readonly root: Element | null = root; readonly rootMargin: string = rootMargin; readonly thresholds: ReadonlyArray < number > = thresholds; disconnect: () => void = disconnect; observe: (target: Element) => void = observe; takeRecords: () => IntersectionObserverEntry[] = takeRecords; unobserve: (target: Element) => void = unobserve; } Object.defineProperty( window, 'IntersectionObserver', { writable: true, configurable: true, value: MockIntersectionObserver, }, ); Object.defineProperty( globalThis, 'IntersectionObserver', { writable: true, configurable: true, value: MockIntersectionObserver, }, ); } export default setupIntersectionObserverMock;