1
1
import * as React from 'react' ;
2
2
import { TextInput , TextInputProps , View } from 'react-native' ;
3
- import { createEventLogger } from '../../../test-utils' ;
3
+ import { createEventLogger , EventEntry } from '../../../test-utils' ;
4
4
import { render , screen } from '../../..' ;
5
5
import { userEvent } from '../..' ;
6
6
@@ -31,18 +31,17 @@ function renderTextInputWithToolkit(props: TextInputProps = {}) {
31
31
) ;
32
32
33
33
return {
34
- ...screen ,
35
34
events,
36
35
} ;
37
36
}
38
37
39
38
describe ( 'type()' , ( ) => {
40
39
it ( 'supports basic case' , async ( ) => {
41
40
jest . spyOn ( Date , 'now' ) . mockImplementation ( ( ) => 100100100100 ) ;
42
- const { events, ... queries } = renderTextInputWithToolkit ( ) ;
41
+ const { events } = renderTextInputWithToolkit ( ) ;
43
42
44
43
const user = userEvent . setup ( ) ;
45
- await user . type ( queries . getByTestId ( 'input' ) , 'abc' ) ;
44
+ await user . type ( screen . getByTestId ( 'input' ) , 'abc' ) ;
46
45
47
46
const eventNames = events . map ( ( e ) => e . name ) ;
48
47
expect ( eventNames ) . toEqual ( [
@@ -70,10 +69,10 @@ describe('type()', () => {
70
69
71
70
it . each ( [ 'modern' , 'legacy' ] ) ( 'works with %s fake timers' , async ( type ) => {
72
71
jest . useFakeTimers ( { legacyFakeTimers : type === 'legacy' } ) ;
73
- const { events, ... queries } = renderTextInputWithToolkit ( ) ;
72
+ const { events } = renderTextInputWithToolkit ( ) ;
74
73
75
74
const user = userEvent . setup ( ) ;
76
- await user . type ( queries . getByTestId ( 'input' ) , 'abc' ) ;
75
+ await user . type ( screen . getByTestId ( 'input' ) , 'abc' ) ;
77
76
78
77
const eventNames = events . map ( ( e ) => e . name ) ;
79
78
expect ( eventNames ) . toEqual ( [
@@ -98,12 +97,12 @@ describe('type()', () => {
98
97
} ) ;
99
98
100
99
it ( 'supports defaultValue prop' , async ( ) => {
101
- const { events, ... queries } = renderTextInputWithToolkit ( {
100
+ const { events } = renderTextInputWithToolkit ( {
102
101
defaultValue : 'xxx' ,
103
102
} ) ;
104
103
105
104
const user = userEvent . setup ( ) ;
106
- await user . type ( queries . getByTestId ( 'input' ) , 'ab' ) ;
105
+ await user . type ( screen . getByTestId ( 'input' ) , 'ab' ) ;
107
106
108
107
const eventNames = events . map ( ( e ) => e . name ) ;
109
108
expect ( eventNames ) . toEqual ( [
@@ -126,24 +125,24 @@ describe('type()', () => {
126
125
} ) ;
127
126
128
127
it ( 'does respect editable prop' , async ( ) => {
129
- const { events, ... queries } = renderTextInputWithToolkit ( {
128
+ const { events } = renderTextInputWithToolkit ( {
130
129
editable : false ,
131
130
} ) ;
132
131
133
132
const user = userEvent . setup ( ) ;
134
- await user . type ( queries . getByTestId ( 'input' ) , 'ab' ) ;
133
+ await user . type ( screen . getByTestId ( 'input' ) , 'ab' ) ;
135
134
136
135
const eventNames = events . map ( ( e ) => e . name ) ;
137
136
expect ( eventNames ) . toEqual ( [ ] ) ;
138
137
} ) ;
139
138
140
139
it ( 'supports backspace' , async ( ) => {
141
- const { events, ... queries } = renderTextInputWithToolkit ( {
140
+ const { events } = renderTextInputWithToolkit ( {
142
141
defaultValue : 'xxx' ,
143
142
} ) ;
144
143
145
144
const user = userEvent . setup ( ) ;
146
- await user . type ( queries . getByTestId ( 'input' ) , '{Backspace}a' ) ;
145
+ await user . type ( screen . getByTestId ( 'input' ) , '{Backspace}a' ) ;
147
146
148
147
const eventNames = events . map ( ( e ) => e . name ) ;
149
148
expect ( eventNames ) . toEqual ( [
@@ -166,12 +165,12 @@ describe('type()', () => {
166
165
} ) ;
167
166
168
167
it ( 'supports multiline' , async ( ) => {
169
- const { events, ... queries } = renderTextInputWithToolkit ( {
168
+ const { events } = renderTextInputWithToolkit ( {
170
169
multiline : true ,
171
170
} ) ;
172
171
173
172
const user = userEvent . setup ( ) ;
174
- await user . type ( queries . getByTestId ( 'input' ) , '{Enter}\n' ) ;
173
+ await user . type ( screen . getByTestId ( 'input' ) , '{Enter}\n' ) ;
175
174
176
175
const eventNames = events . map ( ( e ) => e . name ) ;
177
176
expect ( eventNames ) . toEqual ( [
@@ -198,10 +197,10 @@ describe('type()', () => {
198
197
} ) ;
199
198
200
199
test ( 'skips press events when `skipPress: true`' , async ( ) => {
201
- const { events, ... queries } = renderTextInputWithToolkit ( ) ;
200
+ const { events } = renderTextInputWithToolkit ( ) ;
202
201
203
202
const user = userEvent . setup ( ) ;
204
- await user . type ( queries . getByTestId ( 'input' ) , 'a' , {
203
+ await user . type ( screen . getByTestId ( 'input' ) , 'a' , {
205
204
skipPress : true ,
206
205
} ) ;
207
206
@@ -217,13 +216,17 @@ describe('type()', () => {
217
216
'endEditing' ,
218
217
'blur' ,
219
218
] ) ;
219
+
220
+ expect ( lastEvent ( events , 'endEditing' ) ?. payload ) . toMatchObject ( {
221
+ nativeEvent : { text : 'a' , target : 0 } ,
222
+ } ) ;
220
223
} ) ;
221
224
222
225
it ( 'triggers submit event with `submitEditing: true`' , async ( ) => {
223
- const { events, ... queries } = renderTextInputWithToolkit ( ) ;
226
+ const { events } = renderTextInputWithToolkit ( ) ;
224
227
225
228
const user = userEvent . setup ( ) ;
226
- await user . type ( queries . getByTestId ( 'input' ) , 'a' , {
229
+ await user . type ( screen . getByTestId ( 'input' ) , 'a' , {
227
230
submitEditing : true ,
228
231
} ) ;
229
232
@@ -241,8 +244,7 @@ describe('type()', () => {
241
244
'blur' ,
242
245
] ) ;
243
246
244
- expect ( events [ 7 ] . name ) . toBe ( 'submitEditing' ) ;
245
- expect ( events [ 7 ] . payload ) . toMatchObject ( {
247
+ expect ( lastEvent ( events , 'submitEditing' ) ?. payload ) . toMatchObject ( {
246
248
nativeEvent : { text : 'a' , target : 0 } ,
247
249
currentTarget : { } ,
248
250
target : { } ,
@@ -339,35 +341,39 @@ describe('type()', () => {
339
341
expect ( handleKeyPress ) . toHaveBeenCalledTimes ( 3 ) ;
340
342
} ) ;
341
343
342
- it ( 'does respect maxLength prop' , async ( ) => {
343
- const { events, ...queries } = renderTextInputWithToolkit ( {
344
- maxLength : 2 ,
345
- } ) ;
344
+ it ( 'respects the "maxLength" prop' , async ( ) => {
345
+ const { events } = renderTextInputWithToolkit ( { maxLength : 2 } ) ;
346
346
347
347
const user = userEvent . setup ( ) ;
348
- await user . type ( queries . getByTestId ( 'input' ) , 'abc ' ) ;
348
+ await user . type ( screen . getByTestId ( 'input' ) , 'abcd ' ) ;
349
349
350
350
const eventNames = events . map ( ( e ) => e . name ) ;
351
351
expect ( eventNames ) . toEqual ( [
352
352
'pressIn' ,
353
353
'focus' ,
354
354
'pressOut' ,
355
- 'keyPress' ,
355
+ 'keyPress' , // a
356
356
'change' ,
357
357
'changeText' ,
358
358
'selectionChange' ,
359
- 'keyPress' ,
359
+ 'keyPress' , // b
360
360
'change' ,
361
361
'changeText' ,
362
362
'selectionChange' ,
363
+ 'keyPress' , // c
364
+ 'keyPress' , // d
363
365
'endEditing' ,
364
366
'blur' ,
365
367
] ) ;
366
368
367
- const lastChangeTestEvent = events . filter ( ( e ) => e . name === 'changeText' ) . pop ( ) ;
368
- expect ( lastChangeTestEvent ) . toMatchObject ( {
369
- name : 'changeText' ,
370
- payload : 'ab' ,
369
+ expect ( lastEvent ( events , 'changeText' ) ?. payload ) . toBe ( 'ab' ) ;
370
+ expect ( lastEvent ( events , 'endEditing' ) ?. payload . nativeEvent ) . toMatchObject ( {
371
+ target : 0 ,
372
+ text : 'ab' ,
371
373
} ) ;
372
374
} ) ;
373
375
} ) ;
376
+
377
+ function lastEvent ( events : EventEntry [ ] , name : string ) {
378
+ return events . filter ( ( e ) => e . name === name ) . pop ( ) ;
379
+ }
0 commit comments