1+ import * as React from 'react' ;
2+ import { render , fireEvent } from '@testing-library/react' ;
3+ import InputNumber from '../src' ;
4+
5+ describe ( 'InputNumber.AllowClear' , ( ) => {
6+ it ( 'should render clear icon when allowClear is true and value is not empty' , ( ) => {
7+ const { container } = render (
8+ < InputNumber allowClear value = { 123 } />
9+ ) ;
10+
11+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
12+ expect ( clearIcon ) . toBeTruthy ( ) ;
13+ expect ( clearIcon ) . not . toHaveClass ( 'rc-input-number-clear-icon-hidden' ) ;
14+ } ) ;
15+
16+ it ( 'should not render clear icon when value is empty' , ( ) => {
17+ const { container } = render (
18+ < InputNumber allowClear value = { null } />
19+ ) ;
20+
21+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
22+ expect ( clearIcon ) . toHaveClass ( 'rc-input-number-clear-icon-hidden' ) ;
23+ } ) ;
24+
25+ it ( 'should not render clear icon when disabled' , ( ) => {
26+ const { container } = render (
27+ < InputNumber allowClear value = { 123 } disabled />
28+ ) ;
29+
30+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
31+ expect ( clearIcon ) . toHaveClass ( 'rc-input-number-clear-icon-hidden' ) ;
32+ } ) ;
33+
34+ it ( 'should not render clear icon when readOnly' , ( ) => {
35+ const { container } = render (
36+ < InputNumber allowClear value = { 123 } readOnly />
37+ ) ;
38+
39+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
40+ expect ( clearIcon ) . toHaveClass ( 'rc-input-number-clear-icon-hidden' ) ;
41+ } ) ;
42+
43+ it ( 'should clear value to null when allowClear is true (boolean type)' , ( ) => {
44+ const onChange = jest . fn ( ) ;
45+ const { container } = render (
46+ < InputNumber allowClear value = { 123 } onChange = { onChange } />
47+ ) ;
48+
49+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
50+ fireEvent . click ( clearIcon ) ;
51+
52+ expect ( onChange ) . toHaveBeenCalledTimes ( 1 ) ;
53+ expect ( onChange ) . toHaveBeenCalledWith ( null ) ;
54+ } ) ;
55+
56+ it ( 'should clear value to custom value when allowClear is object with clearValue' , ( ) => {
57+ const onChange = jest . fn ( ) ;
58+ const { container } = render (
59+ < InputNumber
60+ allowClear = { { clearValue : 0 } }
61+ value = { 123 }
62+ onChange = { onChange }
63+ />
64+ ) ;
65+
66+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
67+ fireEvent . click ( clearIcon ) ;
68+
69+ expect ( onChange ) . toHaveBeenCalledTimes ( 1 ) ;
70+ expect ( onChange ) . toHaveBeenCalledWith ( 0 ) ;
71+ } ) ;
72+
73+ it ( 'should handle string clearValue correctly' , ( ) => {
74+ const onChange = jest . fn ( ) ;
75+ const { container } = render (
76+ < InputNumber
77+ allowClear = { { clearValue : 'reset' } }
78+ value = { 123 }
79+ onChange = { onChange }
80+ stringMode
81+ />
82+ ) ;
83+
84+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
85+ fireEvent . click ( clearIcon ) ;
86+
87+ expect ( onChange ) . toHaveBeenCalledTimes ( 1 ) ;
88+ expect ( onChange ) . toHaveBeenCalledWith ( null ) ;
89+ } ) ;
90+
91+ it ( 'should support all clearValue types' , ( ) => {
92+ const onChange1 = jest . fn ( ) ;
93+ const onChange2 = jest . fn ( ) ;
94+ const onChange3 = jest . fn ( ) ;
95+
96+ // Test number clearValue
97+ const { container : container1 , unmount : unmount1 } = render (
98+ < InputNumber allowClear = { { clearValue : 42 } } value = { 123 } onChange = { onChange1 } />
99+ ) ;
100+ fireEvent . click ( container1 . querySelector ( '.rc-input-number-clear-icon' ) ) ;
101+ expect ( onChange1 ) . toHaveBeenCalledWith ( 42 ) ;
102+ unmount1 ( ) ;
103+
104+ // Test zero clearValue
105+ const { container : container2 , unmount : unmount2 } = render (
106+ < InputNumber allowClear = { { clearValue : 0 } } value = { 123 } onChange = { onChange2 } />
107+ ) ;
108+ fireEvent . click ( container2 . querySelector ( '.rc-input-number-clear-icon' ) ) ;
109+ expect ( onChange2 ) . toHaveBeenCalledWith ( 0 ) ;
110+ unmount2 ( ) ;
111+
112+ // Test undefined clearValue
113+ const { container : container3 , unmount : unmount3 } = render (
114+ < InputNumber allowClear = { { clearValue : undefined } } value = { 123 } onChange = { onChange3 } />
115+ ) ;
116+ fireEvent . click ( container3 . querySelector ( '.rc-input-number-clear-icon' ) ) ;
117+ expect ( onChange3 ) . toHaveBeenCalledWith ( null ) ;
118+ unmount3 ( ) ;
119+ } ) ;
120+
121+ it ( 'should trigger onClear callback when clear icon is clicked' , ( ) => {
122+ const onClear = jest . fn ( ) ;
123+ const onChange = jest . fn ( ) ;
124+ const { container } = render (
125+ < InputNumber
126+ allowClear
127+ value = { 123 }
128+ onClear = { onClear }
129+ onChange = { onChange }
130+ />
131+ ) ;
132+
133+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
134+ fireEvent . click ( clearIcon ) ;
135+
136+ expect ( onClear ) . toHaveBeenCalledTimes ( 1 ) ;
137+ expect ( onChange ) . toHaveBeenCalledTimes ( 1 ) ;
138+ } ) ;
139+
140+ it ( 'should have correct className when suffix is provided' , ( ) => {
141+ const { container } = render (
142+ < InputNumber allowClear value = { 123 } suffix = "$" />
143+ ) ;
144+
145+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
146+ expect ( clearIcon ) . toHaveClass ( 'rc-input-number-clear-icon-has-suffix' ) ;
147+ } ) ;
148+
149+ it ( 'should work with defaultValue' , ( ) => {
150+ const onChange = jest . fn ( ) ;
151+ const { container } = render (
152+ < InputNumber
153+ allowClear
154+ defaultValue = { 100 }
155+ onChange = { onChange }
156+ />
157+ ) ;
158+
159+ const clearIcon = container . querySelector ( '.rc-input-number-clear-icon' ) ;
160+ fireEvent . click ( clearIcon ) ;
161+
162+ expect ( onChange ) . toHaveBeenCalledTimes ( 1 ) ;
163+ expect ( onChange ) . toHaveBeenCalledWith ( null ) ;
164+ } ) ;
165+ } ) ;
0 commit comments