import React from 'react';
import { getFormGroupState, useFormGroup } from './useFormGroup';
import {
AdminContext,
ArrayInput,
SimpleForm,
SimpleFormIterator,
TextInput,
} from 'ra-ui-materialui';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import expect from 'expect';
import { FormGroupContextProvider } from './FormGroupContextProvider';
import { testDataProvider } from '../dataProvider';
describe('useFormGroup', () => {
test.each([
[
'some fields are dirty and invalid',
[
{
isValid: true,
isDirty: false,
isTouched: false,
name: 'title',
},
{
isValid: false,
isDirty: true,
isTouched: true,
error: 'Invalid',
name: 'description',
},
],
{
isValid: false,
isDirty: true,
isTouched: true,
errors: {
description: 'Invalid',
},
},
],
[
'none of the fields is invalid nor dirty',
[
{
isValid: true,
isDirty: false,
isTouched: false,
name: 'title',
},
{
isValid: true,
isDirty: false,
isTouched: false,
name: 'description',
},
],
{
isValid: true,
isDirty: false,
isTouched: false,
errors: {},
},
],
[
'none of the fields is invalid but some are dirty',
[
{
isValid: true,
isDirty: false,
isTouched: false,
name: 'title',
},
{
isValid: true,
isDirty: true,
isTouched: true,
name: 'description',
},
],
{
isValid: true,
isDirty: true,
isTouched: true,
errors: {},
},
],
])(
'should return a correct form group state when %s',
(_, fieldStates, expectedGroupState) => {
expect(getFormGroupState(fieldStates)).toEqual(expectedGroupState);
}
);
it('should return correct group state', async () => {
let state;
const IsDirty = () => {
state = useFormGroup('simplegroup');
return null;
};
render(
);
await waitFor(() => {
expect(state).toEqual({
errors: {},
isDirty: false,
isTouched: false,
isValid: true,
});
});
const input = screen.getByLabelText('resources.undefined.fields.url');
fireEvent.change(input, {
target: { value: 'test' },
});
fireEvent.blur(input);
await waitFor(() => {
expect(state).toEqual({
errors: {},
isDirty: true,
isTouched: true,
isValid: true,
});
});
});
it('should return correct group state when an ArrayInput is in the group', async () => {
let state;
const IsDirty = () => {
state = useFormGroup('backlinks');
return null;
};
const backlinksDefaultValue = [
{
date: '2012-08-22T00:00:00.000Z',
url: 'https://foo.bar.com/lorem/ipsum',
},
];
render(
);
await waitFor(() => {
expect(state).toEqual({
errors: {},
isDirty: false,
isTouched: false,
isValid: true,
});
});
const addItemElement = screen
.getByLabelText('ra.action.add')
.closest('button') as HTMLButtonElement;
fireEvent.click(addItemElement);
await waitFor(() => {
expect(state).toEqual({
errors: {},
isDirty: true,
isTouched: false,
isValid: true,
});
});
});
});