diff --git a/frontend/src/components/Loadable/Loadable.test.tsx b/frontend/src/components/Loadable/Loadable.test.tsx new file mode 100644 index 0000000000..cb1239334f --- /dev/null +++ b/frontend/src/components/Loadable/Loadable.test.tsx @@ -0,0 +1,49 @@ +import { + render, + screen, + waitForElementToBeRemoved, +} from '@testing-library/react'; +import React from 'react'; + +import Loadable from './index'; + +// Sample component to be loaded lazily +function SampleComponent(): JSX.Element { + return
Sample Component
; +} + +const loadSampleComponent = (): Promise<{ + default: React.ComponentType; +}> => + new Promise<{ default: React.ComponentType }>((resolve) => { + setTimeout(() => { + resolve({ default: SampleComponent }); + }, 500); + }); + +describe('Loadable', () => { + it('should render the lazily loaded component', async () => { + const LoadableSampleComponent = Loadable(loadSampleComponent); + + const { container } = render( + Loading...}> + + , + ); + + expect(screen.getByText('Loading...')).toBeInTheDocument(); + await waitForElementToBeRemoved(() => screen.queryByText('Loading...')); + + expect(container.querySelector('div')).toHaveTextContent('Sample Component'); + }); + + it('should call React.lazy with the provided import path', () => { + const reactLazySpy = jest.spyOn(React, 'lazy'); + Loadable(loadSampleComponent); + + expect(reactLazySpy).toHaveBeenCalledTimes(1); + expect(reactLazySpy).toHaveBeenCalledWith(expect.any(Function)); + + reactLazySpy.mockRestore(); + }); +});