2017-01-30 20:05:47 +08:00
import React from 'react' ;
import { mount } from 'enzyme' ;
2019-08-06 15:02:05 +08:00
// eslint-disable-next-line import/no-unresolved
2017-07-16 15:39:21 +08:00
import Form from '../../form' ;
2019-02-07 11:39:16 +08:00
import Input from '..' ;
2017-11-19 01:41:40 +08:00
import focusTest from '../../../tests/shared/focusTest' ;
2019-08-26 22:53:20 +08:00
import mountTest from '../../../tests/shared/mountTest' ;
2020-01-02 19:10:16 +08:00
import rtlTest from '../../../tests/shared/rtlTest' ;
2019-03-04 09:47:58 +08:00
import calculateNodeHeight , { calculateNodeStyling } from '../calculateNodeHeight' ;
2017-01-30 20:05:47 +08:00
2017-07-07 20:26:08 +08:00
const { TextArea } = Input ;
2017-01-30 20:05:47 +08:00
2017-09-27 09:56:30 +08:00
describe ( 'Input' , ( ) => {
2019-03-07 15:47:43 +08:00
const errorSpy = jest . spyOn ( console , 'error' ) . mockImplementation ( ( ) => { } ) ;
afterEach ( ( ) => {
errorSpy . mockReset ( ) ;
} ) ;
afterAll ( ( ) => {
errorSpy . mockRestore ( ) ;
} ) ;
2017-11-19 01:41:40 +08:00
focusTest ( Input ) ;
2019-08-26 22:53:20 +08:00
mountTest ( Input ) ;
2019-08-27 16:13:43 +08:00
mountTest ( Input . Group ) ;
2017-11-19 01:41:40 +08:00
2020-01-02 19:10:16 +08:00
rtlTest ( Input ) ;
rtlTest ( Input . Group ) ;
2017-11-16 17:12:36 +08:00
it ( 'should support maxLength' , ( ) => {
2018-12-27 11:46:22 +08:00
const wrapper = mount ( < Input maxLength = { 3 } / > ) ;
2017-09-27 09:56:30 +08:00
expect ( wrapper ) . toMatchSnapshot ( ) ;
} ) ;
2018-08-28 18:54:21 +08:00
it ( 'select()' , ( ) => {
2018-12-07 20:02:01 +08:00
const wrapper = mount ( < Input / > ) ;
2018-08-28 18:54:21 +08:00
wrapper . instance ( ) . select ( ) ;
} ) ;
2019-03-07 15:47:43 +08:00
describe ( 'focus trigger warning' , ( ) => {
it ( 'not trigger' , ( ) => {
const wrapper = mount ( < Input suffix = "bamboo" / > ) ;
wrapper
. find ( 'input' )
. instance ( )
. focus ( ) ;
wrapper . setProps ( {
suffix : 'light' ,
} ) ;
2019-04-03 15:54:26 +08:00
expect ( errorSpy ) . not . toHaveBeenCalled ( ) ;
2019-03-07 15:47:43 +08:00
} ) ;
it ( 'trigger warning' , ( ) => {
const wrapper = mount ( < Input / > ) ;
wrapper
. find ( 'input' )
. instance ( )
. focus ( ) ;
wrapper . setProps ( {
suffix : 'light' ,
} ) ;
2019-04-03 15:54:26 +08:00
expect ( errorSpy ) . toHaveBeenCalledWith (
2019-03-07 15:47:43 +08:00
'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' ,
) ;
} ) ;
} ) ;
2017-09-27 09:56:30 +08:00
} ) ;
2017-11-01 12:12:16 +08:00
2017-11-19 01:41:40 +08:00
focusTest ( TextArea ) ;
2017-07-07 20:26:08 +08:00
describe ( 'TextArea' , ( ) => {
2017-11-16 17:12:36 +08:00
beforeAll ( ( ) => {
jest . useFakeTimers ( ) ;
} ) ;
afterAll ( ( ) => {
jest . useRealTimers ( ) ;
} ) ;
it ( 'should auto calculate height according to content length' , ( ) => {
2019-10-11 18:12:28 +08:00
const wrapper = mount ( < TextArea value = "" readOnly autoSize / > ) ;
2019-11-01 18:19:29 +08:00
const mockFunc = jest . spyOn ( wrapper . instance ( ) . resizableTextArea , 'resizeTextarea' ) ;
2017-01-30 20:05:47 +08:00
wrapper . setProps ( { value : '1111\n2222\n3333' } ) ;
2017-11-16 17:12:36 +08:00
jest . runAllTimers ( ) ;
2017-07-07 20:26:08 +08:00
expect ( mockFunc ) . toHaveBeenCalledTimes ( 1 ) ;
2017-01-30 20:05:47 +08:00
wrapper . setProps ( { value : '1111' } ) ;
2017-11-16 17:12:36 +08:00
jest . runAllTimers ( ) ;
2017-07-07 20:26:08 +08:00
expect ( mockFunc ) . toHaveBeenCalledTimes ( 2 ) ;
2019-08-22 11:55:37 +08:00
wrapper . update ( ) ;
2019-08-06 15:29:13 +08:00
expect ( wrapper . find ( 'textarea' ) . props ( ) . style . overflow ) . toBeFalsy ( ) ;
2017-01-30 20:05:47 +08:00
} ) ;
2017-07-21 20:23:38 +08:00
2019-03-01 15:59:32 +08:00
it ( 'should support onPressEnter and onKeyDown' , ( ) => {
const fakeHandleKeyDown = jest . fn ( ) ;
const fakeHandlePressEnter = jest . fn ( ) ;
const wrapper = mount (
< TextArea onKeyDown = { fakeHandleKeyDown } onPressEnter = { fakeHandlePressEnter } / > ,
) ;
/** 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 ) ;
2019-03-01 11:21:00 +08:00
} ) ;
2017-11-16 17:12:36 +08:00
it ( 'should support disabled' , ( ) => {
2018-12-07 20:02:01 +08:00
const wrapper = mount ( < TextArea disabled / > ) ;
2017-07-21 20:23:38 +08:00
expect ( wrapper ) . toMatchSnapshot ( ) ;
} ) ;
2017-09-27 09:56:30 +08:00
2017-11-16 17:12:36 +08:00
it ( 'should support maxLength' , ( ) => {
2018-12-27 11:46:22 +08:00
const wrapper = mount ( < TextArea maxLength = { 10 } / > ) ;
2017-09-27 09:56:30 +08:00
expect ( wrapper ) . toMatchSnapshot ( ) ;
} ) ;
2019-03-04 09:47:58 +08:00
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 ,
} ) ;
} ) ;
2019-03-04 10:39:47 +08:00
it ( 'when prop value not in this.props, resizeTextarea should be called' , ( ) => {
2019-03-04 10:47:31 +08:00
const wrapper = mount ( < TextArea aria - label = "textarea" / > ) ;
2019-11-01 18:19:29 +08:00
const resizeTextarea = jest . spyOn ( wrapper . instance ( ) . resizableTextArea , 'resizeTextarea' ) ;
2019-03-04 10:39:47 +08:00
wrapper . find ( 'textarea' ) . simulate ( 'change' , 'test' ) ;
expect ( resizeTextarea ) . toHaveBeenCalled ( ) ;
} ) ;
it ( 'handleKeyDown' , ( ) => {
const onPressEnter = jest . fn ( ) ;
const onKeyDown = jest . fn ( ) ;
2019-03-04 10:47:31 +08:00
const wrapper = mount (
< TextArea onPressEnter = { onPressEnter } onKeyDown = { onKeyDown } aria - label = "textarea" / > ,
) ;
2019-03-04 10:39:47 +08:00
wrapper . instance ( ) . handleKeyDown ( { keyCode : 13 } ) ;
2019-04-03 15:54:26 +08:00
expect ( onPressEnter ) . toHaveBeenCalled ( ) ;
expect ( onKeyDown ) . toHaveBeenCalled ( ) ;
2019-03-04 10:39:47 +08:00
} ) ;
2019-12-25 22:02:19 +08:00
it ( 'should trigger onResize' , ( ) => {
const onResize = jest . fn ( ) ;
const wrapper = mount ( < TextArea onResize = { onResize } autosize / > ) ;
wrapper
. find ( 'ResizeObserver' )
. instance ( )
. onResize ( [
{
target : {
getBoundingClientRect ( ) {
return { } ;
} ,
} ,
} ,
] ) ;
expect ( onResize ) . toHaveBeenCalledWith (
expect . objectContaining ( {
width : expect . any ( Number ) ,
height : expect . any ( Number ) ,
} ) ,
) ;
} ) ;
2017-01-30 20:05:47 +08:00
} ) ;
2017-07-16 15:39:21 +08:00
describe ( 'As Form Control' , ( ) => {
2017-11-16 17:12:36 +08:00
it ( 'should be reset when wrapped in form.getFieldDecorator without initialValue' , ( ) => {
2019-07-03 20:14:39 +08:00
const Demo = ( ) => {
const [ form ] = Form . useForm ( ) ;
const reset = ( ) => {
2018-06-22 21:05:13 +08:00
form . resetFields ( ) ;
2018-12-07 20:02:01 +08:00
} ;
2018-06-22 21:05:13 +08:00
2019-07-03 20:14:39 +08:00
return (
< Form form = { form } >
< Form . Item name = "input" >
< Input / >
< / F o r m . I t e m >
< Form . Item name = "textarea" >
< Input . TextArea / >
< / F o r m . I t e m >
< button type = "button" onClick = { reset } >
reset
< / b u t t o n >
< / F o r m >
) ;
} ;
const wrapper = mount ( < Demo / > ) ;
2017-07-16 15:39:21 +08:00
wrapper . find ( 'input' ) . simulate ( 'change' , { target : { value : '111' } } ) ;
wrapper . find ( 'textarea' ) . simulate ( 'change' , { target : { value : '222' } } ) ;
expect ( wrapper . find ( 'input' ) . prop ( 'value' ) ) . toBe ( '111' ) ;
expect ( wrapper . find ( 'textarea' ) . prop ( 'value' ) ) . toBe ( '222' ) ;
wrapper . find ( 'button' ) . simulate ( 'click' ) ;
expect ( wrapper . find ( 'input' ) . prop ( 'value' ) ) . toBe ( '' ) ;
expect ( wrapper . find ( 'textarea' ) . prop ( 'value' ) ) . toBe ( '' ) ;
} ) ;
} ) ;
2017-11-01 12:12:16 +08:00
describe ( 'Input.Search' , ( ) => {
2017-11-16 17:12:36 +08:00
it ( 'should support suffix' , ( ) => {
2018-12-07 20:02:01 +08:00
const wrapper = mount ( < Input . Search suffix = "suffix" / > ) ;
2017-11-01 12:12:16 +08:00
expect ( wrapper ) . toMatchSnapshot ( ) ;
} ) ;
} ) ;
2018-11-29 10:03:16 +08:00
2018-12-26 22:34:29 +08:00
describe ( 'Input allowClear' , ( ) => {
it ( 'should change type when click' , ( ) => {
const wrapper = mount ( < Input allowClear / > ) ;
wrapper . find ( 'input' ) . simulate ( 'change' , { target : { value : '111' } } ) ;
expect ( wrapper . find ( 'input' ) . getDOMNode ( ) . value ) . toEqual ( '111' ) ;
expect ( wrapper ) . toMatchSnapshot ( ) ;
wrapper
. find ( '.ant-input-clear-icon' )
. at ( 0 )
. simulate ( 'click' ) ;
expect ( wrapper ) . toMatchSnapshot ( ) ;
expect ( wrapper . find ( 'input' ) . getDOMNode ( ) . value ) . toEqual ( '' ) ;
} ) ;
2018-12-28 15:48:05 +08:00
2019-02-07 11:39:16 +08:00
it ( 'should not show icon if value is undefined, null or empty string' , ( ) => {
const wrappers = [ null , undefined , '' ] . map ( val => mount ( < Input allowClear value = { val } / > ) ) ;
wrappers . forEach ( wrapper => {
expect ( wrapper . find ( 'input' ) . getDOMNode ( ) . value ) . toEqual ( '' ) ;
expect ( wrapper . find ( '.ant-input-clear-icon' ) . exists ( ) ) . toEqual ( false ) ;
expect ( wrapper ) . toMatchSnapshot ( ) ;
} ) ;
} ) ;
it ( 'should not show icon if defaultValue is undefined, null or empty string' , ( ) => {
const wrappers = [ null , undefined , '' ] . map ( val =>
mount ( < Input allowClear defaultValue = { val } / > ) ,
) ;
wrappers . forEach ( wrapper => {
expect ( wrapper . find ( 'input' ) . getDOMNode ( ) . value ) . toEqual ( '' ) ;
expect ( wrapper . find ( '.ant-input-clear-icon' ) . exists ( ) ) . toEqual ( false ) ;
expect ( wrapper ) . toMatchSnapshot ( ) ;
} ) ;
} ) ;
2018-12-28 15:48:05 +08:00
it ( 'should trigger event correctly' , ( ) => {
let argumentEventObject ;
let argumentEventObjectValue ;
const onChange = e => {
argumentEventObject = e ;
argumentEventObjectValue = e . target . value ;
} ;
const wrapper = mount ( < Input allowClear defaultValue = "111" onChange = { onChange } / > ) ;
wrapper
. find ( '.ant-input-clear-icon' )
. at ( 0 )
. simulate ( 'click' ) ;
expect ( argumentEventObject . type ) . toBe ( 'click' ) ;
expect ( argumentEventObjectValue ) . toBe ( '' ) ;
2019-01-07 09:40:55 +08:00
expect (
wrapper
. find ( 'input' )
. at ( 0 )
. getDOMNode ( ) . value ,
) . toBe ( '' ) ;
2018-12-28 15:48:05 +08:00
} ) ;
it ( 'should trigger event correctly on controlled mode' , ( ) => {
let argumentEventObject ;
let argumentEventObjectValue ;
const onChange = e => {
argumentEventObject = e ;
argumentEventObjectValue = e . target . value ;
} ;
const wrapper = mount ( < Input allowClear value = "111" onChange = { onChange } / > ) ;
wrapper
. find ( '.ant-input-clear-icon' )
. at ( 0 )
. simulate ( 'click' ) ;
expect ( argumentEventObject . type ) . toBe ( 'click' ) ;
expect ( argumentEventObjectValue ) . toBe ( '' ) ;
2019-01-07 09:40:55 +08:00
expect (
wrapper
. find ( 'input' )
. at ( 0 )
. getDOMNode ( ) . value ,
) . toBe ( '111' ) ;
2018-12-28 15:48:05 +08:00
} ) ;
2019-03-05 11:16:13 +08:00
it ( 'should focus input after clear' , ( ) => {
const wrapper = mount ( < Input allowClear defaultValue = "111" / > ) ;
wrapper
. find ( '.ant-input-clear-icon' )
. at ( 0 )
. simulate ( 'click' ) ;
expect ( document . activeElement ) . toBe (
2019-03-06 13:45:40 +08:00
wrapper
. find ( 'input' )
. at ( 0 )
. getDOMNode ( ) ,
2019-03-05 11:16:13 +08:00
) ;
} ) ;
2019-08-26 22:58:00 +08:00
it ( 'should not support allowClear when it is disabled' , ( ) => {
const wrapper = mount ( < Input allowClear defaultValue = "111" disabled / > ) ;
expect ( wrapper . find ( '.ant-input-clear-icon' ) . length ) . toBe ( 0 ) ;
} ) ;
2018-12-26 22:34:29 +08:00
} ) ;
2019-11-01 18:19:29 +08:00
describe ( 'TextArea allowClear' , ( ) => {
it ( 'should change type when click' , ( ) => {
const wrapper = mount ( < TextArea allowClear / > ) ;
wrapper . find ( 'textarea' ) . simulate ( 'change' , { target : { value : '111' } } ) ;
expect ( wrapper . find ( 'textarea' ) . getDOMNode ( ) . value ) . toEqual ( '111' ) ;
expect ( wrapper ) . toMatchSnapshot ( ) ;
wrapper
. find ( '.ant-input-textarea-clear-icon' )
. at ( 0 )
. simulate ( 'click' ) ;
expect ( wrapper ) . toMatchSnapshot ( ) ;
expect ( wrapper . find ( 'textarea' ) . getDOMNode ( ) . value ) . toEqual ( '' ) ;
} ) ;
it ( 'should not show icon if value is undefined, null or empty string' , ( ) => {
const wrappers = [ null , undefined , '' ] . map ( val => mount ( < TextArea allowClear value = { val } / > ) ) ;
wrappers . forEach ( wrapper => {
expect ( wrapper . find ( 'textarea' ) . getDOMNode ( ) . value ) . toEqual ( '' ) ;
expect ( wrapper . find ( '.ant-input-textarea-clear-icon' ) . exists ( ) ) . toEqual ( false ) ;
expect ( wrapper ) . toMatchSnapshot ( ) ;
} ) ;
} ) ;
it ( 'should not show icon if defaultValue is undefined, null or empty string' , ( ) => {
const wrappers = [ null , undefined , '' ] . map ( val =>
mount ( < TextArea allowClear defaultValue = { val } / > ) ,
) ;
wrappers . forEach ( wrapper => {
expect ( wrapper . find ( 'textarea' ) . getDOMNode ( ) . value ) . toEqual ( '' ) ;
expect ( wrapper . find ( '.ant-textarea-clear-icon' ) . exists ( ) ) . toEqual ( false ) ;
expect ( wrapper ) . toMatchSnapshot ( ) ;
} ) ;
} ) ;
it ( 'should trigger event correctly' , ( ) => {
let argumentEventObject ;
let argumentEventObjectValue ;
const onChange = e => {
argumentEventObject = e ;
argumentEventObjectValue = e . target . value ;
} ;
const wrapper = mount ( < TextArea allowClear defaultValue = "111" onChange = { onChange } / > ) ;
wrapper
. find ( '.ant-input-textarea-clear-icon' )
. at ( 0 )
. simulate ( 'click' ) ;
expect ( argumentEventObject . type ) . toBe ( 'click' ) ;
expect ( argumentEventObjectValue ) . toBe ( '' ) ;
expect (
wrapper
. find ( 'textarea' )
. at ( 0 )
. getDOMNode ( ) . value ,
) . toBe ( '' ) ;
} ) ;
it ( 'should trigger event correctly on controlled mode' , ( ) => {
let argumentEventObject ;
let argumentEventObjectValue ;
const onChange = e => {
argumentEventObject = e ;
argumentEventObjectValue = e . target . value ;
} ;
const wrapper = mount ( < TextArea allowClear value = "111" onChange = { onChange } / > ) ;
wrapper
. find ( '.ant-input-textarea-clear-icon' )
. at ( 0 )
. simulate ( 'click' ) ;
expect ( argumentEventObject . type ) . toBe ( 'click' ) ;
expect ( argumentEventObjectValue ) . toBe ( '' ) ;
expect (
wrapper
. find ( 'textarea' )
. at ( 0 )
. getDOMNode ( ) . value ,
) . toBe ( '111' ) ;
} ) ;
it ( 'should focus textarea after clear' , ( ) => {
const wrapper = mount ( < TextArea allowClear defaultValue = "111" / > ) ;
wrapper
. find ( '.ant-input-textarea-clear-icon' )
. at ( 0 )
. simulate ( 'click' ) ;
expect ( document . activeElement ) . toBe (
wrapper
. find ( 'textarea' )
. at ( 0 )
. getDOMNode ( ) ,
) ;
} ) ;
it ( 'should not support allowClear when it is disabled' , ( ) => {
const wrapper = mount ( < TextArea allowClear defaultValue = "111" disabled / > ) ;
expect ( wrapper . find ( '.ant-input-textarea-clear-icon' ) . length ) . toBe ( 0 ) ;
} ) ;
2020-01-09 11:13:07 +08:00
it ( 'not block input when `value` is undefined' , ( ) => {
const wrapper = mount ( < Input value = { undefined } / > ) ;
wrapper . find ( 'input' ) . simulate ( 'change' , { target : { value : 'Bamboo' } } ) ;
expect ( wrapper . find ( 'input' ) . props ( ) . value ) . toEqual ( 'Bamboo' ) ;
// Controlled
wrapper . setProps ( { value : 'Light' } ) ;
wrapper . find ( 'input' ) . simulate ( 'change' , { target : { value : 'Bamboo' } } ) ;
expect ( wrapper . find ( 'input' ) . props ( ) . value ) . toEqual ( 'Light' ) ;
} ) ;
2019-11-01 18:19:29 +08:00
} ) ;