@@ -33,24 +33,22 @@ export type EventHandlers = {[k in keyof DocumentEventMap]?: EventListener}
33
33
34
34
const loggedEvents = [
35
35
...( Object . keys ( eventMap ) as Array < keyof typeof eventMap > ) ,
36
- 'focus' ,
37
- 'focusin' ,
38
- 'focusout' ,
39
- 'blur' ,
40
36
'select' ,
41
37
] as const
42
38
43
39
/**
44
40
* Add listeners for logging events.
45
41
*/
46
42
export function addListeners (
47
- element : Element ,
43
+ element : Element | Element [ ] ,
48
44
{
49
45
eventHandlers = { } ,
50
46
} : {
51
47
eventHandlers ?: EventHandlers
52
48
} = { } ,
53
49
) {
50
+ const elements = Array . isArray ( element ) ? element : [ element ]
51
+
54
52
type CallData = {
55
53
event : Event
56
54
elementDisplayName : string
@@ -59,14 +57,16 @@ export function addListeners(
59
57
60
58
const generalListener = mocks . fn ( eventHandler ) . mockName ( 'eventListener' )
61
59
62
- for ( const eventType of loggedEvents ) {
63
- addEventListener ( element , eventType , ( ...args ) => {
64
- generalListener ( ...args )
65
- eventHandlers [ eventType ] ?.( ...args )
66
- } )
67
- }
60
+ for ( const el of elements ) {
61
+ for ( const eventType of loggedEvents ) {
62
+ addEventListener ( el , eventType , ( ...args ) => {
63
+ generalListener ( ...args )
64
+ eventHandlers [ eventType ] ?.( ...args )
65
+ } )
66
+ }
68
67
69
- addEventListener ( element , 'submit' , e => e . preventDefault ( ) )
68
+ addEventListener ( el , 'submit' , e => e . preventDefault ( ) )
69
+ }
70
70
71
71
return {
72
72
clearEventCalls,
@@ -132,16 +132,14 @@ export function addListeners(
132
132
. join ( '\n' )
133
133
. trim ( )
134
134
135
+ const displayNames = elements . map ( el => getElementDisplayName ( el ) ) . join ( ',' )
135
136
if ( eventCalls . length ) {
136
137
return {
137
- snapshot : [
138
- `Events fired on: ${ getElementDisplayName ( element ) } ` ,
139
- eventCalls ,
140
- ] . join ( '\n\n' ) ,
138
+ snapshot : [ `Events fired on: ${ displayNames } ` , eventCalls ] . join ( '\n\n' ) ,
141
139
}
142
140
} else {
143
141
return {
144
- snapshot : `No events were fired on: ${ getElementDisplayName ( element ) } ` ,
142
+ snapshot : `No events were fired on: ${ displayNames } ` ,
145
143
}
146
144
}
147
145
}
@@ -174,6 +172,10 @@ function isKeyboardEvent(event: Event): event is KeyboardEvent {
174
172
)
175
173
}
176
174
175
+ function isFocusEvent ( event : Event ) : event is FocusEvent {
176
+ return event . constructor . name === 'FocusEvent'
177
+ }
178
+
177
179
function isPointerEvent ( event : Event ) : event is PointerEvent {
178
180
return event . type . startsWith ( 'pointer' )
179
181
}
@@ -241,6 +243,22 @@ function getEventLabel(event: Event) {
241
243
return getMouseButtonName ( event . button ) ?? `button${ event . button } `
242
244
} else if ( isKeyboardEvent ( event ) ) {
243
245
return event . key === ' ' ? 'Space' : event . key
246
+ } else if ( isFocusEvent ( event ) ) {
247
+ const direction =
248
+ event . type === 'focus' || event . type === 'focusin' ? 'β' : 'β'
249
+ let label
250
+ if (
251
+ ! event . relatedTarget ||
252
+ // Jsdom sets `relatedTarget` to `Document` on blur/focusout
253
+ ( 'nodeType' in event . relatedTarget && event . relatedTarget . nodeType === 9 )
254
+ ) {
255
+ label = 'null'
256
+ } else if ( isElement ( event . relatedTarget ) ) {
257
+ label = getElementDisplayName ( event . relatedTarget )
258
+ } else {
259
+ label = event . relatedTarget . constructor . name
260
+ }
261
+ return `${ direction } ${ label } `
244
262
}
245
263
}
246
264
0 commit comments