import * as React from 'react'; import { render, waitFor, screen, fireEvent } from '@testing-library/react'; import { FormDataConsumer, FormDataConsumerView } from './FormDataConsumer'; import { testDataProvider } from '../dataProvider'; import { AdminContext, BooleanInput, SimpleForm, TextInput, SimpleFormIterator, ArrayInput, } from 'ra-ui-materialui'; import expect from 'expect'; import { ResourceContextProvider } from '../core'; import { Form } from '../form'; import { TestMemoryRouter } from '../routing'; describe('FormDataConsumerView', () => { it('does not call its children function with scopedFormData if it did not receive a source containing an index', () => { const children = jest.fn(); const formData = { id: 123, title: 'A title' }; render(
{children}
); expect(children).toHaveBeenCalledWith({ formData, }); }); it('calls its children with updated formData on first render', async () => { let globalFormData; render( {({ formData }) => { globalFormData = formData; return ; }} ); await waitFor(() => { expect(globalFormData).toEqual({ hi: true, bye: undefined }); }); }); it('should be reactive', async () => { render( {({ formData }) => !formData.hi ? : null } ); await waitFor(() => { expect( screen.queryByLabelText('resources.posts.fields.bye') ).toBeNull(); }); fireEvent.click(screen.getByLabelText('resources.posts.fields.hi')); await waitFor(() => { expect( screen.getByLabelText('resources.posts.fields.bye') ).not.toBeNull(); }); }); it('calls its children with updated scopedFormData when inside an ArrayInput', async () => { let globalScopedFormData; render( {({ scopedFormData }) => { globalScopedFormData = scopedFormData; return scopedFormData && scopedFormData.name ? ( ) : null; }} ); expect(globalScopedFormData).toEqual(undefined); fireEvent.click(screen.getByLabelText('ra.action.add')); expect(globalScopedFormData).toEqual({ name: null }); fireEvent.change( screen.getByLabelText('resources.posts.fields.authors.name'), { target: { value: 'a' }, } ); await waitFor(() => { expect(globalScopedFormData).toEqual({ name: 'a', role: undefined, }); }); }); });