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(
);
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,
});
});
});
});