import React from 'react'; import { mount } from 'enzyme'; import scrollIntoView from 'dom-scroll-into-view'; import Form from '..'; import Input from '../../input'; import Button from '../../button'; import mountTest from '../../../tests/shared/mountTest'; jest.mock('dom-scroll-into-view'); const delay = () => new Promise(resolve => { setTimeout(resolve, 0); }); describe('Form', () => { mountTest(Form); mountTest(Form.Item); scrollIntoView.mockImplementation(() => {}); const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); async function change(wrapper, index, value) { wrapper .find(Input) .at(index) .simulate('change', { target: { value } }); await delay(); wrapper.update(); } beforeEach(() => { scrollIntoView.mockReset(); }); afterEach(() => { errorSpy.mockReset(); }); afterAll(() => { errorSpy.mockRestore(); scrollIntoView.mockRestore(); }); describe('List', () => { function testList(name, renderField) { it(name, async () => { const wrapper = mount(
{(fields, { add, remove }) => ( <> {fields.map(field => renderField(field))} )}
, ); async function operate(className) { wrapper .find(className) .last() .simulate('click'); await delay(); wrapper.update(); } await operate('.add'); expect(wrapper.find(Input).length).toBe(1); await operate('.add'); expect(wrapper.find(Input).length).toBe(2); await change(wrapper, 1, ''); expect(wrapper.find('.ant-form-item-explain').length).toBe(1); await operate('.remove'); expect(wrapper.find(Input).length).toBe(1); expect(wrapper.find('.ant-form-item-explain').length).toBe(0); }); } testList('operation correctly', field => ( )); testList('nest noStyle', field => ( )); }); it('noStyle Form.Item', async () => { const onChange = jest.fn(); const wrapper = mount(
, ); await change(wrapper, 0, ''); expect(wrapper.find('.ant-form-item-explain').length).toBe(1); expect(onChange).toHaveBeenCalled(); }); it('`shouldUpdate` should work with render props', () => { mount(
{() => null}
, ); expect(errorSpy).toHaveBeenCalledWith( 'Warning: [antd: Form.Item] `children` of render props only work with `shouldUpdate`.', ); }); describe('scrollToField', () => { function test(name, genForm) { it(name, () => { let callGetForm; const Demo = () => { const { props, getForm } = genForm(); callGetForm = getForm; return (
); }; mount(, { attachTo: document.body }); expect(scrollIntoView).not.toHaveBeenCalled(); callGetForm().scrollToField('test'); expect(scrollIntoView).toHaveBeenCalled(); }); } // hooks test('useForm', () => { const [form] = Form.useForm(); return { props: { form }, getForm: () => form, }; }); // ref test('ref', () => { let form; return { props: { ref: instance => { form = instance; }, }, getForm: () => form, }; }); }); it('Form.Item should support data-*、aria-* and custom attribute', () => { const wrapper = mount(
, ); expect(wrapper.render()).toMatchSnapshot(); }); it('warning when use `name` but children is not validate element', () => { mount(
text
, ); expect(errorSpy).toHaveBeenCalledWith( 'Warning: [antd: Form.Item] `name` is only used for validate React element. If you are using Form.Item as layout display, please remove `name` instead.', ); }); it('dynamic change required', () => { const wrapper = mount(
({ required: getFieldValue('light') })]} >
, ); expect(wrapper.find('.ant-form-item-required')).toHaveLength(0); wrapper.find('input[type="checkbox"]').simulate('change', { target: { checked: true } }); wrapper.update(); expect(wrapper.find('.ant-form-item-required')).toHaveLength(1); }); });