/**
* External dependencies
*/
import { render, screen, fireEvent } from '@testing-library/react';
/**
* Internal dependencies
*/
import { ErrorBoundary } from '../';
const ThrowError = () => {
throw new Error( 'Test error' );
return null;
};
describe( 'ErrorBoundary', () => {
function onError( event: Event ) {
// Note: this will swallow reports about unhandled errors!
// Use with extreme caution.
event.preventDefault();
}
// Mock window.location.reload by using a global variable
const originalLocation = window.location;
beforeAll( () => {
// Opt Out of the jsdom error messages
window.addEventListener( 'error', onError );
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore - Ignore TS error for deleting window.location
delete window.location;
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore - Ignore TS error for assigning window.location
window.location = { reload: jest.fn() };
} );
afterAll( () => {
window.location = originalLocation;
window.removeEventListener( 'error', onError );
} );
it( 'catches errors and displays an error message', () => {
render(
);
expect(
screen.getByText( 'Oops, something went wrong' )
).toBeInTheDocument();
} );
it( 'shows refresh and report issue buttons', () => {
render(
);
expect( screen.getByText( 'Reload Page' ) ).toBeInTheDocument();
expect( screen.getByText( 'Get Support' ) ).toBeInTheDocument();
} );
it( 'refreshes the page when Refresh Page button is clicked', () => {
const reloadMock = jest.fn();
Object.defineProperty( window.location, 'reload', {
configurable: true,
value: reloadMock,
} );
render(
);
fireEvent.click( screen.getByText( 'Reload Page' ) );
expect( reloadMock ).toHaveBeenCalled();
} );
it( 'opens a new issue when Report Issue button is clicked', () => {
const openSpy = jest
.spyOn( window, 'open' )
.mockImplementation( () => null );
render(
);
fireEvent.click( screen.getByText( 'Get Support' ) );
expect( openSpy ).toHaveBeenCalledWith(
'https://wordpress.org/support/plugin/woocommerce/',
'_blank'
);
openSpy.mockRestore();
} );
} );