@@ -4,12 +4,23 @@ import { screen } from '@testing-library/react';
44import { render } from 'lib/testHelpers' ;
55import userEvent from '@testing-library/user-event' ;
66
7+ // Mock useFormContext
8+ let component : HTMLInputElement ;
9+
710const setupWrapper = ( props ?: Partial < InputProps > ) => (
811 < Input name = "test" { ...props } />
912) ;
1013jest . mock ( 'react-hook-form' , ( ) => ( {
1114 useFormContext : ( ) => ( {
1215 register : jest . fn ( ) ,
16+
17+ // Mock methods.getValues and methods.setValue
18+ getValues : jest . fn ( ( ) => {
19+ return component . value ;
20+ } ) ,
21+ setValue : jest . fn ( ( key , val ) => {
22+ component . value = val ;
23+ } ) ,
1324 } ) ,
1425} ) ) ;
1526
@@ -23,20 +34,146 @@ describe('Custom Input', () => {
2334 } ) ;
2435 } ) ;
2536 describe ( 'number' , ( ) => {
26- const getInput = ( ) => screen . getByRole ( 'spinbutton' ) ;
37+ const getInput = ( ) => screen . getByRole < HTMLInputElement > ( 'spinbutton' ) ;
38+
39+ describe ( 'input' , ( ) => {
40+ it ( 'allows user to type numbers only' , async ( ) => {
41+ render ( setupWrapper ( { type : 'number' } ) ) ;
42+ const input = getInput ( ) ;
43+ component = input ;
44+ await userEvent . type ( input , 'abc131' ) ;
45+ expect ( input ) . toHaveValue ( 131 ) ;
46+ } ) ;
47+
48+ it ( 'allows user to type negative values' , async ( ) => {
49+ render ( setupWrapper ( { type : 'number' } ) ) ;
50+ const input = getInput ( ) ;
51+ component = input ;
52+ await userEvent . type ( input , '-2' ) ;
53+ expect ( input ) . toHaveValue ( - 2 ) ;
54+ } ) ;
55+
56+ it ( 'allows user to type positive values only' , async ( ) => {
57+ render ( setupWrapper ( { type : 'number' , positiveOnly : true } ) ) ;
58+ const input = getInput ( ) ;
59+ component = input ;
60+ await userEvent . type ( input , '-2' ) ;
61+ expect ( input ) . toHaveValue ( 2 ) ;
62+ } ) ;
63+
64+ it ( 'allows user to type decimal' , async ( ) => {
65+ render ( setupWrapper ( { type : 'number' } ) ) ;
66+ const input = getInput ( ) ;
67+ component = input ;
68+ await userEvent . type ( input , '2.3' ) ;
69+ expect ( input ) . toHaveValue ( 2.3 ) ;
70+ } ) ;
71+
72+ it ( 'allows user to type integer only' , async ( ) => {
73+ render ( setupWrapper ( { type : 'number' , integerOnly : true } ) ) ;
74+ const input = getInput ( ) ;
75+ component = input ;
76+ await userEvent . type ( input , '2.3' ) ;
77+ expect ( input ) . toHaveValue ( 23 ) ;
78+ } ) ;
79+
80+ it ( "not allow '-' appear at any position of the string except the start" , async ( ) => {
81+ render ( setupWrapper ( { type : 'number' } ) ) ;
82+ const input = getInput ( ) ;
83+ component = input ;
84+ await userEvent . type ( input , '2-3' ) ;
85+ expect ( input ) . toHaveValue ( 23 ) ;
86+ } ) ;
2787
28- it ( 'allows user to type only numbers' , async ( ) => {
29- render ( setupWrapper ( { type : 'number' } ) ) ;
30- const input = getInput ( ) ;
31- await userEvent . type ( input , 'abc131' ) ;
32- expect ( input ) . toHaveValue ( 131 ) ;
88+ it ( "not allow '.' appear at the start of the string" , async ( ) => {
89+ render ( setupWrapper ( { type : 'number' } ) ) ;
90+ const input = getInput ( ) ;
91+ component = input ;
92+ await userEvent . type ( input , '.33' ) ;
93+ expect ( input ) . toHaveValue ( 33 ) ;
94+ } ) ;
95+
96+ it ( "not allow '.' appear twice in the string" , async ( ) => {
97+ render ( setupWrapper ( { type : 'number' } ) ) ;
98+ const input = getInput ( ) ;
99+ component = input ;
100+ await userEvent . type ( input , '3.3.3' ) ;
101+ expect ( input ) . toHaveValue ( 3.33 ) ;
102+ } ) ;
33103 } ) ;
34104
35- it ( 'allows negative values' , async ( ) => {
36- render ( setupWrapper ( { type : 'number' } ) ) ;
37- const input = getInput ( ) ;
38- await userEvent . type ( input , '-2' ) ;
39- expect ( input ) . toHaveValue ( - 2 ) ;
105+ describe ( 'paste' , ( ) => {
106+ it ( 'allows user to paste numbers only' , async ( ) => {
107+ render ( setupWrapper ( { type : 'number' } ) ) ;
108+ const input = getInput ( ) ;
109+ component = input ;
110+ await userEvent . click ( input ) ;
111+ await userEvent . paste ( 'abc131' ) ;
112+ expect ( input ) . toHaveValue ( 131 ) ;
113+ } ) ;
114+
115+ it ( 'allows user to paste negative values' , async ( ) => {
116+ render ( setupWrapper ( { type : 'number' } ) ) ;
117+ const input = getInput ( ) ;
118+ component = input ;
119+ await userEvent . click ( input ) ;
120+ await userEvent . paste ( '-2' ) ;
121+ expect ( input ) . toHaveValue ( - 2 ) ;
122+ } ) ;
123+
124+ it ( 'allows user to paste positive values only' , async ( ) => {
125+ render ( setupWrapper ( { type : 'number' , positiveOnly : true } ) ) ;
126+ const input = getInput ( ) ;
127+ component = input ;
128+ await userEvent . click ( input ) ;
129+ await userEvent . paste ( '-2' ) ;
130+ expect ( input ) . toHaveValue ( 2 ) ;
131+ } ) ;
132+
133+ it ( 'allows user to paste decimal' , async ( ) => {
134+ render ( setupWrapper ( { type : 'number' } ) ) ;
135+ const input = getInput ( ) ;
136+ component = input ;
137+ await userEvent . click ( input ) ;
138+ await userEvent . paste ( '2.3' ) ;
139+ expect ( input ) . toHaveValue ( 2.3 ) ;
140+ } ) ;
141+
142+ it ( 'allows user to paste integer only' , async ( ) => {
143+ render ( setupWrapper ( { type : 'number' , integerOnly : true } ) ) ;
144+ const input = getInput ( ) ;
145+ component = input ;
146+ await userEvent . click ( input ) ;
147+ await userEvent . paste ( '2.3' ) ;
148+ expect ( input ) . toHaveValue ( 23 ) ;
149+ } ) ;
150+
151+ it ( "not allow '-' appear at any position of the pasted string except the start" , async ( ) => {
152+ render ( setupWrapper ( { type : 'number' } ) ) ;
153+ const input = getInput ( ) ;
154+ component = input ;
155+ await userEvent . click ( input ) ;
156+ await userEvent . paste ( '2-3' ) ;
157+ expect ( input ) . toHaveValue ( 23 ) ;
158+ } ) ;
159+
160+ it ( "not allow '.' appear at the start of the pasted string" , async ( ) => {
161+ render ( setupWrapper ( { type : 'number' } ) ) ;
162+ const input = getInput ( ) ;
163+ component = input ;
164+ await userEvent . click ( input ) ;
165+ await userEvent . paste ( '.33' ) ;
166+ expect ( input ) . toHaveValue ( 0.33 ) ;
167+ } ) ;
168+
169+ it ( "not allow '.' appear twice in the pasted string" , async ( ) => {
170+ render ( setupWrapper ( { type : 'number' } ) ) ;
171+ const input = getInput ( ) ;
172+ component = input ;
173+ await userEvent . click ( input ) ;
174+ await userEvent . paste ( '3.3.3' ) ;
175+ expect ( input ) . toHaveValue ( 3.33 ) ;
176+ } ) ;
40177 } ) ;
41178 } ) ;
42179} ) ;
0 commit comments