import '@testing-library/jest-dom';
import * as React from 'react';
import { cleanup, render } from '@testing-library/react';
import Try from '.';
describe('Try component', () => {
beforeEach(() => {
jest.spyOn(console, 'error').mockImplementation(() => { });
jest.spyOn(console, 'warn').mockImplementation(() => { });
});
afterEach(() => {
cleanup();
(console.error as any).mockRestore();
(console.warn as any).mockRestore();
});
const ErrorComponent = ({ shouldThrow }: { shouldThrow?: boolean }) => {
if (shouldThrow) {
throw new Error('💣');
} else {
return null;
}
};
const ErrorParent = () => (
<>
>
);
test('Render children without errors', () => {
const { container } = render(
Test string;
);
expect(container.innerHTML).toBe('Test string;');
});
test('Should catch error and render nothing', () => {
const { container, rerender } = render();
rerender();
expect(console.error).toHaveBeenCalledTimes(2);
expect(console.warn).toHaveBeenCalledTimes(2);
expect(container.innerHTML).toBe('');
});
test('Should catch error from deep children', () => {
const { container, rerender } = render();
rerender();
expect(console.error).toHaveBeenCalledTimes(2);
expect(console.warn).toHaveBeenCalledTimes(2);
expect(container.innerHTML).toBe('');
});
test('Should suppress warning messages if silent === true', () => {
const { rerender } = render();
rerender();
expect(console.warn).toHaveBeenCalledTimes(0);
});
test('Should execute onCatch callback and render its result', () => {
const { container, rerender } = render();
rerender(
<>{error.message}>}
>
);
expect(container.innerHTML).toBe('💣');
});
});