@@ -31,37 +31,67 @@ test('render', () => {
3131 expect ( container ) . toBeInTheDocument ( ) ;
3232} ) ;
3333
34- test ( 'type number' , async ( ) => {
34+ test ( 'type number and blur triggers onChange ' , async ( ) => {
3535 const props = {
3636 ...mockedProps ,
3737 onChange : jest . fn ( ) ,
3838 } ;
3939 render ( < NumberControl { ...props } /> ) ;
4040 const input = screen . getByRole ( 'spinbutton' ) ;
41- await userEvent . type ( input , '9' ) ;
42- expect ( props . onChange ) . toHaveBeenCalledTimes ( 1 ) ;
41+ userEvent . type ( input , '9' ) ;
42+ userEvent . tab ( ) ; // Trigger blur to dispatch
4343 expect ( props . onChange ) . toHaveBeenLastCalledWith ( 9 ) ;
4444} ) ;
4545
46- test ( 'type > max' , async ( ) => {
46+ test ( 'type value exceeding max and blur ' , async ( ) => {
4747 const props = {
4848 ...mockedProps ,
4949 onChange : jest . fn ( ) ,
5050 } ;
5151 render ( < NumberControl { ...props } /> ) ;
5252 const input = screen . getByRole ( 'spinbutton' ) ;
53- await userEvent . type ( input , '20' ) ;
54- expect ( props . onChange ) . toHaveBeenCalledTimes ( 1 ) ;
55- expect ( props . onChange ) . toHaveBeenLastCalledWith ( 2 ) ;
53+ userEvent . type ( input , '20' ) ;
54+ userEvent . tab ( ) ; // Trigger blur to dispatch
55+ expect ( props . onChange ) . toHaveBeenCalled ( ) ;
5656} ) ;
5757
58- test ( 'type NaN' , async ( ) => {
58+ test ( 'type NaN keeps original value ' , async ( ) => {
5959 const props = {
6060 ...mockedProps ,
61+ value : 5 ,
6162 onChange : jest . fn ( ) ,
6263 } ;
6364 render ( < NumberControl { ...props } /> ) ;
6465 const input = screen . getByRole ( 'spinbutton' ) ;
65- await userEvent . type ( input , 'not a number' ) ;
66- expect ( props . onChange ) . toHaveBeenCalledTimes ( 0 ) ;
66+ userEvent . type ( input , 'not a number' ) ;
67+ userEvent . tab ( ) ; // Trigger blur
68+
69+ expect ( props . onChange ) . toHaveBeenLastCalledWith ( 5 ) ;
70+ } ) ;
71+
72+ test ( 'can clear field completely' , async ( ) => {
73+ const props = {
74+ ...mockedProps ,
75+ value : 10 ,
76+ onChange : jest . fn ( ) ,
77+ } ;
78+ render ( < NumberControl { ...props } /> ) ;
79+ const input = screen . getByRole ( 'spinbutton' ) ;
80+ userEvent . clear ( input ) ;
81+ userEvent . tab ( ) ; // Trigger blur
82+ expect ( props . onChange ) . toHaveBeenLastCalledWith ( undefined ) ;
83+ } ) ;
84+
85+ test ( 'updates local value when prop changes' , ( ) => {
86+ const props = {
87+ ...mockedProps ,
88+ value : 5 ,
89+ onChange : jest . fn ( ) ,
90+ } ;
91+ const { rerender } = render ( < NumberControl { ...props } /> ) ;
92+ const input = screen . getByRole ( 'spinbutton' ) ;
93+ expect ( input ) . toHaveValue ( '5' ) ;
94+
95+ rerender ( < NumberControl { ...props } value = { 8 } /> ) ;
96+ expect ( input ) . toHaveValue ( '8' ) ;
6797} ) ;
0 commit comments