| | import React from 'react'; |
| | import { render, screen, fireEvent } from '@testing-library/react'; |
| | import '@testing-library/jest-dom'; |
| | import SourcesErrorBoundary from '../SourcesErrorBoundary'; |
| |
|
| | |
| | const ThrowError = ({ shouldThrow }: { shouldThrow: boolean }) => { |
| | if (shouldThrow) { |
| | throw new Error('Test error'); |
| | } |
| | return <div data-testid="normal-component">{'Normal component'}</div>; |
| | }; |
| |
|
| | |
| | const mockReload = jest.fn(); |
| | Object.defineProperty(window, 'location', { |
| | value: { |
| | reload: mockReload, |
| | }, |
| | writable: true, |
| | }); |
| |
|
| | describe('SourcesErrorBoundary - NEW COMPONENT test', () => { |
| | beforeEach(() => { |
| | jest.clearAllMocks(); |
| | |
| | jest.spyOn(console, 'error').mockImplementation(() => {}); |
| | }); |
| |
|
| | afterEach(() => { |
| | jest.restoreAllMocks(); |
| | }); |
| |
|
| | it('should render children when there is no error', () => { |
| | render( |
| | <SourcesErrorBoundary> |
| | <ThrowError shouldThrow={false} /> |
| | </SourcesErrorBoundary>, |
| | ); |
| |
|
| | expect(screen.getByTestId('normal-component')).toBeInTheDocument(); |
| | }); |
| |
|
| | it('should render default error UI when error occurs', () => { |
| | render( |
| | <SourcesErrorBoundary> |
| | <ThrowError shouldThrow={true} /> |
| | </SourcesErrorBoundary>, |
| | ); |
| |
|
| | expect(screen.getByText('Sources temporarily unavailable')).toBeInTheDocument(); |
| | expect(screen.getByRole('button', { name: 'Reload the page' })).toBeInTheDocument(); |
| | }); |
| |
|
| | it('should reload page when refresh button is clicked', () => { |
| | render( |
| | <SourcesErrorBoundary> |
| | <ThrowError shouldThrow={true} /> |
| | </SourcesErrorBoundary>, |
| | ); |
| |
|
| | const refreshButton = screen.getByRole('button', { name: 'Reload the page' }); |
| | fireEvent.click(refreshButton); |
| |
|
| | expect(mockReload).toHaveBeenCalled(); |
| | }); |
| | }); |
| |
|