/* eslint-disable @typescript-eslint/ban-ts-comment */ import React from 'react'; import {renderHook} from '@testing-library/react-hooks'; import {PerformanceProfiler} from '../../context'; import useReportEmitter from '../../context/useReportEmitter'; import {OnStateChangedListener, useStateController, useStateControllerInitializer} from '../../state-machine'; jest.mock('../../state-machine/controller/useStateControllerInitializer', () => { return jest.fn(); }); jest.mock('../../context/useReportEmitter', () => { return jest.fn(); }); describe('context/PerformanceProfiler', () => { const mockStateController = {key: 'value'}; let mockReportEmitter: OnStateChangedListener; beforeEach(() => { mockReportEmitter = jest.fn(); // @ts-ignore useStateControllerInitializer.mockReturnValue(mockStateController); // @ts-ignore useReportEmitter.mockReturnValue(mockReportEmitter); }); afterEach(() => { jest.resetAllMocks(); }); it('intializes the state controller via the useStateControllerInitializer hook', () => { const wrapper = ({children}: {children: React.ReactElement}) => ( {children} ); const resolvedStateController = renderHook(() => useStateController(), { wrapper, }).result.current; expect(resolvedStateController).toBe(mockStateController); }); it('uses the report emitter prepared by the useReportEmitter hook', () => { const wrapper = ({children}: {children: React.ReactElement}) => ( {children} ); expect(useStateControllerInitializer).not.toHaveBeenCalled(); renderHook(() => useStateController(), {wrapper}); expect(useStateControllerInitializer).toHaveBeenCalledWith( expect.objectContaining({reportEmitter: mockReportEmitter}), ); }); it('uses render timeouts by default', () => { const wrapper = ({children}: {children: React.ReactElement}) => ( {children} ); renderHook(() => useStateController(), {wrapper}); expect(useStateControllerInitializer).toHaveBeenCalledWith(expect.objectContaining({useRenderTimeouts: true})); }); it('does not use render timeouts if turned off', () => { const wrapper = ({children}: {children: React.ReactElement}) => ( {children} ); renderHook(() => useStateController(), {wrapper}); expect(useStateControllerInitializer).toHaveBeenCalledWith(expect.objectContaining({useRenderTimeouts: false})); }); it('overrides render timeout if provided', () => { const wrapper = ({children}: {children: React.ReactElement}) => ( {children} ); renderHook(() => useStateController(), {wrapper}); expect(useStateControllerInitializer).toHaveBeenCalledWith(expect.objectContaining({renderTimeoutMillis: 3000})); }); it('does not use render timeout if turned off, but override is provided', () => { const wrapper = ({children}: {children: React.ReactElement}) => ( {children} ); renderHook(() => useStateController(), {wrapper}); expect(useStateControllerInitializer).toHaveBeenCalledWith(expect.objectContaining({useRenderTimeouts: false})); }); });