import React from 'react'; import { mount } from 'enzyme'; // eslint-disable-next-line import/no-unresolved import Form from '../../form'; import Input from '..'; import focusTest from '../../../tests/shared/focusTest'; import mountTest from '../../../tests/shared/mountTest'; import calculateNodeHeight, { calculateNodeStyling } from '../calculateNodeHeight'; const { TextArea } = Input; describe('Input', () => { const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); afterEach(() => { errorSpy.mockReset(); }); afterAll(() => { errorSpy.mockRestore(); }); focusTest(Input); mountTest(Input); it('should support maxLength', () => { const wrapper = mount(); expect(wrapper).toMatchSnapshot(); }); it('select()', () => { const wrapper = mount(); wrapper.instance().select(); }); describe('focus trigger warning', () => { it('not trigger', () => { const wrapper = mount(); wrapper .find('input') .instance() .focus(); wrapper.setProps({ suffix: 'light', }); expect(errorSpy).not.toHaveBeenCalled(); }); it('trigger warning', () => { const wrapper = mount(); wrapper .find('input') .instance() .focus(); wrapper.setProps({ suffix: 'light', }); expect(errorSpy).toHaveBeenCalledWith( 'Warning: [antd: Input] When Input is focused, dynamic add or remove prefix / suffix will make it lose focus caused by dom structure change. Read more: https://ant.design/components/input/#FAQ', ); }); }); }); focusTest(TextArea); describe('TextArea', () => { beforeAll(() => { jest.useFakeTimers(); }); afterAll(() => { jest.useRealTimers(); }); it('should auto calculate height according to content length', () => { const wrapper = mount(); const mockFunc = jest.spyOn(wrapper.instance(), 'resizeTextarea'); wrapper.setProps({ value: '1111\n2222\n3333' }); jest.runAllTimers(); expect(mockFunc).toHaveBeenCalledTimes(1); wrapper.setProps({ value: '1111' }); jest.runAllTimers(); expect(mockFunc).toHaveBeenCalledTimes(2); wrapper.update(); expect(wrapper.find('textarea').props().style.overflow).toBeFalsy(); }); it('should support onPressEnter and onKeyDown', () => { const fakeHandleKeyDown = jest.fn(); const fakeHandlePressEnter = jest.fn(); const wrapper = mount( , ); /** keyCode 65 is A */ wrapper.find('textarea').simulate('keydown', { keyCode: 65 }); expect(fakeHandleKeyDown).toHaveBeenCalledTimes(1); expect(fakeHandlePressEnter).toHaveBeenCalledTimes(0); /** keyCode 13 is Enter */ wrapper.find('textarea').simulate('keydown', { keyCode: 13 }); expect(fakeHandleKeyDown).toHaveBeenCalledTimes(2); expect(fakeHandlePressEnter).toHaveBeenCalledTimes(1); }); it('should support disabled', () => { const wrapper = mount(); expect(wrapper).toMatchSnapshot(); }); it('should support maxLength', () => { const wrapper = mount(); expect(wrapper).toMatchSnapshot(); }); it('calculateNodeStyling works correctly', () => { const wrapper = document.createElement('textarea'); wrapper.id = 'test'; wrapper.wrap = 'wrap'; calculateNodeStyling(wrapper, true); const value = calculateNodeStyling(wrapper, true); expect(value).toEqual({ borderSize: 2, boxSizing: '', paddingSize: 4, sizingStyle: 'letter-spacing:normal;line-height:normal;padding-top:2px;padding-bottom:2px;font-family:-webkit-small-control;font-weight:;font-size:;font-variant:;text-rendering:auto;text-transform:none;width:;text-indent:0;padding-left:2px;padding-right:2px;border-width:1px;box-sizing:', }); }); it('boxSizing === "border-box"', () => { const wrapper = document.createElement('textarea'); wrapper.style.boxSizing = 'border-box'; const { height } = calculateNodeHeight(wrapper); expect(height).toBe(2); }); it('boxSizing === "content-box"', () => { const wrapper = document.createElement('textarea'); wrapper.style.boxSizing = 'content-box'; const { height } = calculateNodeHeight(wrapper); expect(height).toBe(-4); }); it('minRows or maxRows is not null', () => { const wrapper = document.createElement('textarea'); expect(calculateNodeHeight(wrapper, 1, 1)).toEqual({ height: 0, maxHeight: 9007199254740991, minHeight: -4, overflowY: undefined, }); wrapper.style.boxSizing = 'content-box'; expect(calculateNodeHeight(wrapper, 1, 1)).toEqual({ height: -4, maxHeight: 9007199254740991, minHeight: -4, overflowY: undefined, }); }); it('when prop value not in this.props, resizeTextarea should be called', () => { const wrapper = mount(); const resizeTextarea = jest.spyOn(wrapper.instance(), 'resizeTextarea'); wrapper.find('textarea').simulate('change', 'test'); expect(resizeTextarea).toHaveBeenCalled(); }); it('handleKeyDown', () => { const onPressEnter = jest.fn(); const onKeyDown = jest.fn(); const wrapper = mount( , ); wrapper.instance().handleKeyDown({ keyCode: 13 }); expect(onPressEnter).toHaveBeenCalled(); expect(onKeyDown).toHaveBeenCalled(); }); }); describe('As Form Control', () => { it('should be reset when wrapped in form.getFieldDecorator without initialValue', () => { class Demo extends React.Component { reset = () => { const { form } = this.props; form.resetFields(); }; render() { const { form: { getFieldDecorator }, } = this.props; return (