-
Notifications
You must be signed in to change notification settings - Fork 273
/
Copy pathdispatch-event.ts
47 lines (41 loc) · 1.31 KB
/
dispatch-event.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import type { ReactTestInstance } from 'react-test-renderer';
import act from '../../act';
import { isElementMounted } from '../../helpers/component-tree';
import { formatElement } from '../../helpers/format-element';
import { debugLogger } from '../../helpers/logger';
/**
* Basic dispatch event function used by User Event module.
*
* @param element element trigger event on
* @param eventName name of the event
* @param event event payload(s)
*/
export function dispatchEvent(element: ReactTestInstance, eventName: string, ...event: unknown[]) {
if (!isElementMounted(element)) {
return;
}
const handler = getEventHandler(element, eventName);
if (!handler) {
debugLogger.debug(
`User Event: no event handler for "${eventName}" found on ${formatElement(element, {
compact: true,
})}`,
);
return;
}
// This will be called synchronously.
void act(() => {
handler(...event);
});
}
function getEventHandler(element: ReactTestInstance, eventName: string) {
const handleName = getEventHandlerName(eventName);
const handle = element.props[handleName] as unknown;
if (typeof handle !== 'function') {
return undefined;
}
return handle;
}
function getEventHandlerName(eventName: string) {
return `on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;
}