Skip to content

Commit 68ab299

Browse files
committed
improve debug details
1 parent 8e1503b commit 68ab299

File tree

4 files changed

+39
-15
lines changed

4 files changed

+39
-15
lines changed

src/fire-event.ts

+30-14
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,43 @@ const textInputEventsIgnoringEditableProp = new Set([
4949
'onScroll',
5050
]);
5151

52-
export function isEventEnabled(
52+
type EventHandlerState = {
53+
enabled: boolean;
54+
reason?: string;
55+
};
56+
57+
function getEventHandlerState(
5358
element: ReactTestInstance,
5459
eventName: string,
5560
nearestTouchResponder?: ReactTestInstance,
56-
) {
61+
): EventHandlerState {
5762
if (nearestTouchResponder != null && isHostTextInput(nearestTouchResponder)) {
58-
return (
59-
isEditableTextInput(nearestTouchResponder) ||
60-
textInputEventsIgnoringEditableProp.has(eventName)
61-
);
63+
if (isEditableTextInput(nearestTouchResponder)) {
64+
return { enabled: true };
65+
}
66+
67+
if (textInputEventsIgnoringEditableProp.has(eventName)) {
68+
return { enabled: true };
69+
}
70+
71+
return { enabled: false, reason: '"editable" prop' };
6272
}
6373

6474
if (eventsAffectedByPointerEventsProp.has(eventName) && !isPointerEventEnabled(element)) {
65-
return false;
75+
return { enabled: false, reason: '"pointerEvents" prop' };
6676
}
6777

6878
const touchStart = nearestTouchResponder?.props.onStartShouldSetResponder?.();
6979
const touchMove = nearestTouchResponder?.props.onMoveShouldSetResponder?.();
7080
if (touchStart || touchMove) {
71-
return true;
81+
return { enabled: true };
7282
}
7383

74-
return touchStart === undefined && touchMove === undefined;
84+
if (touchStart === undefined && touchMove === undefined) {
85+
return { enabled: true };
86+
}
87+
88+
return { enabled: false, reason: 'not a touch responder' };
7589
}
7690

7791
function findEventHandler(
@@ -83,13 +97,15 @@ function findEventHandler(
8397

8498
const handler = getEventHandler(element, eventName);
8599
if (handler) {
86-
if (isEventEnabled(element, eventName, touchResponder)) {
100+
const handlerState = getEventHandlerState(element, eventName, touchResponder);
101+
102+
if (handlerState.enabled) {
87103
return handler;
88104
} else {
89105
logger.warn(
90-
`FireEvent "${eventName}": event handler is disabled on ${formatElement(element, {
106+
`FireEvent: "${eventName}" event handler is disabled on ${formatElement(element, {
91107
minimal: true,
92-
})}`,
108+
})} (${handlerState.reason}).`,
93109
);
94110
}
95111
}
@@ -142,9 +158,9 @@ function fireEvent(element: ReactTestInstance, eventName: EventName, ...data: un
142158
const handler = findEventHandler(element, eventName);
143159
if (!handler) {
144160
logger.warn(
145-
`FireEvent "${eventName}": no event handler found on ${formatElement(element, {
161+
`FireEvent: no enabled event handler for "${eventName}" found on ${formatElement(element, {
146162
minimal: true,
147-
})} or its ancestors`,
163+
})} or its ancestors.`,
148164
);
149165
return;
150166
}

src/helpers/format-default.ts

+2
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ const propsToDisplay = [
2525
'aria-valuenow',
2626
'aria-valuetext',
2727
'defaultValue',
28+
'editable',
2829
'importantForAccessibility',
2930
'nativeID',
3031
'placeholder',
32+
'pointerEvents',
3133
'role',
3234
'testID',
3335
'title',

src/helpers/format-element.ts

-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { ElementType } from 'react';
22
import { ReactTestInstance } from 'react-test-renderer';
33
import prettyFormat, { plugins } from 'pretty-format';
4-
import redent from 'redent';
54
import { defaultMapProps } from './format-default';
65

76
export type FormatElementOptions = {

src/user-event/utils/dispatch-event.ts

+7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import type { ReactTestInstance } from 'react-test-renderer';
22
import act from '../../act';
33
import { isElementMounted } from '../../helpers/component-tree';
4+
import { formatElement } from '../../helpers/format-element';
5+
import { logger } from '../../helpers/logger';
46

57
/**
68
* Basic dispatch event function used by User Event module.
@@ -16,6 +18,11 @@ export function dispatchEvent(element: ReactTestInstance, eventName: string, ...
1618

1719
const handler = getEventHandler(element, eventName);
1820
if (!handler) {
21+
logger.debug(
22+
`User Event: no event handler for "${eventName}" found on ${formatElement(element, {
23+
minimal: true,
24+
})}`,
25+
);
1926
return;
2027
}
2128

0 commit comments

Comments
 (0)