import { render, waitFor, act } from '@testing-library/react' import * as React from 'react' import { CustomDataProvider, DataMutation } from '../react' describe('', () => { it('should render without failing', async () => { const endpointSpy = jest.fn(() => Promise.resolve(42)) const mutation = { resource: 'answer', type: 'create' as const, data: { question: '?', }, } const data = { answer: endpointSpy, } const wrapper = ({ children }: { children?: React.ReactNode }) => ( {children} ) const renderSpy: jest.Mock = jest.fn(() => null) render({renderSpy}, { wrapper, }) expect(endpointSpy).toHaveBeenCalledTimes(0) expect(renderSpy).toHaveBeenCalledTimes(1) expect(renderSpy).toHaveBeenLastCalledWith([ expect.any(Function), expect.objectContaining({ called: false, loading: false, engine: expect.any(Object), }), ]) await act(async () => { const firstRenderSpyCall = renderSpy.mock.calls[0] const firstRenderSpyArgument = firstRenderSpyCall[0] const [mutate] = firstRenderSpyArgument await mutate() }) waitFor(() => { expect(endpointSpy).toHaveBeenCalledTimes(1) expect(renderSpy).toHaveBeenCalledTimes(2) expect(renderSpy).toHaveBeenLastCalledWith([ expect.any(Function), expect.objectContaining({ called: true, loading: true, engine: expect.any(Object), }), ]) }) waitFor(() => { expect(endpointSpy).toHaveBeenCalledTimes(1) expect(renderSpy).toHaveBeenCalledTimes(3) expect(renderSpy).toHaveBeenLastCalledWith([ expect.any(Function), expect.objectContaining({ called: true, loading: false, data: { answer: 42 }, engine: expect.any(Object), }), ]) }) }) })