// eslint-env jest import { NetworkManager, actionTypes, Controller, SetResponseAction, } from '@data-client/core'; import { MockResolver } from '@data-client/test'; import { act, render, screen } from '@testing-library/react-native'; import { CoolerArticleResource } from '__tests__/new'; import React, { useContext, Suspense } from 'react'; import { Text } from 'react-native'; import { ControllerContext, StateContext } from '../../context'; import { useController, useSuspense } from '../../hooks'; import { payload } from '../../test-fixtures'; import DataProvider from '../DataProvider'; const { SET_RESPONSE } = actionTypes; describe('', () => { let warnspy: jest.Spied; beforeEach(() => { warnspy = jest.spyOn(global.console, 'warn').mockImplementation(() => {}); }); afterEach(() => { warnspy.mockRestore(); try { screen.unmount(); // eslint-disable-next-line no-empty } catch (e) {} }); it('should warn users about missing Suspense', () => { const Component = () => { const article = useSuspense(CoolerArticleResource.get, { id: 7 }); return {article.title}; }; const tree = ( ); const { getByText } = render(tree); const msg = getByText('Uncaught Suspense.'); expect(msg).toBeDefined(); expect(warnspy).toHaveBeenCalled(); expect(warnspy.mock.calls).toMatchSnapshot(); }); it('should not warn if Suspense is provided', async () => { const Component = () => { const article = useSuspense(CoolerArticleResource.get, { id: 5 }); return {article.title}; }; const tree = ( loading}> ); const { getByText, unmount } = render(tree); const msg = getByText('loading'); expect(msg).toBeDefined(); expect(warnspy).not.toHaveBeenCalled(); const articleOutput = await screen.findByTestId('article'); expect(articleOutput).toBeDefined(); //expect(articleOutput.toJSON()).toMatchInlineSnapshot(); }); it('should not change dispatch function on re-render', () => { let dispatch; let controller; let count = 0; function DispatchTester() { controller = useController(); dispatch = useController().dispatch; count++; return null; } const chil = ; const tree = {chil}; const { rerender } = render(tree); expect(dispatch).toBeDefined(); let curDisp = dispatch; let curController = controller; rerender(tree); expect(curDisp).toBe(dispatch); expect(count).toBe(1); rerender({chil}); expect(curDisp).toBe(dispatch); expect(count).toBe(1); const managers: any[] = [new NetworkManager()]; rerender({chil}); expect(count).toBe(1); curDisp = dispatch; curController = controller; rerender({chil}); expect(curDisp).toBe(dispatch); expect(count).toBe(1); rerender( Promise.resolve() })} > {chil} , ); expect(curController).not.toBe(controller); expect(count).toBe(2); }); it('should change state', () => { let controller: any, state; let count = 0; function ContextTester() { controller = useController(); state = useContext(StateContext); count++; return null; } const chil = ; const tree = {chil}; render(tree); expect(controller.dispatch).toBeDefined(); expect(state).toBeDefined(); const action: SetResponseAction = { type: SET_RESPONSE, response: { id: 5, title: 'hi', content: 'more things here' }, endpoint: CoolerArticleResource.get, args: [{ id: 5 }], key: CoolerArticleResource.get.key({ id: 5 }), meta: { fetchedAt: 50, date: 50, expiresAt: 55, }, }; act(() => { controller.dispatch(action); }); expect(count).toBe(2); expect(state).toMatchSnapshot(); }); });