import { NetworkError, Endpoint } from '@data-client/rest'; import { render } from '@testing-library/react'; import { ReactElement, StrictMode } from 'react'; import { useSuspense } from '../../hooks'; import AsyncBoundary from '../AsyncBoundary'; import DataProvider from '../DataProvider'; describe('', () => { function onError(e: any) { e.preventDefault(); } let errorSpy: jest.SpyInstance; beforeAll(() => { errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); }); afterAll(() => { errorSpy.mockRestore(); }); beforeEach(() => { if (typeof addEventListener === 'function') addEventListener('error', onError); }); afterEach(() => { if (typeof removeEventListener === 'function') removeEventListener('error', onError); }); it('should render children with no error', () => { const tree = hi; const { getByText } = render(tree); expect(getByText(/hi/i)).not.toBeNull(); }); it('should render fallback when suspending', () => { const getThing = new Endpoint(() => Promise.resolve('data'), { name: 'getThing', }); function Data() { const thing = useSuspense(getThing); return
{thing}
; } const tree = ( ); const { getByText } = render(tree); expect(getByText(/loading/i)).not.toBeNull(); }); it('should catch non-network errors', () => { let renderCount = 0; function Throw(): ReactElement { renderCount++; throw new Error('you failed'); } const tree = (
hi
); const { getByText, queryByText, container } = render(tree); expect(getByText(/you failed/i)).not.toBeNull(); expect(renderCount).toBeLessThan(10); }); it('should render error case when thrown', () => { const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); function Throw(): ReactElement { throw new NetworkError( new Response('you failed', { statusText: '', status: 500, }), ); } const tree = (
hi
); const { getByText, queryByText } = render(tree); expect(getByText(/500/i)).not.toBeNull(); expect(queryByText(/hi/i)).toBe(null); errorSpy.mockRestore(); }); it('should render response.statusText using default fallback', () => { const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); function Throw(): ReactElement { const response = new Response('', { statusText: 'my status text', status: 500, }); throw new NetworkError(response); } const tree = (
hi
); const { getByText, queryByText } = render(tree); expect(getByText(/my status text/i)).not.toBeNull(); expect(queryByText(/hi/i)).toBe(null); errorSpy.mockRestore(); }); });