mirror of
https://github.com/callstack/react-native-testing-library.git
synced 2026-09-18 23:09:04 +08:00
03e2c4b0f2
<!-- Please provide enough information so that others can review your pull request. --> <!-- Keep pull requests small and focused on a single change. --> ### Summary This actually uncovered some bugs, like lack of `onDoublePress` (lol XD) and enabled us to have better snapshots for deep rendering. ### Test plan no new tests
49 lines
1.3 KiB
JavaScript
49 lines
1.3 KiB
JavaScript
// @flow
|
|
import ErrorWithStack from './helpers/errorWithStack';
|
|
|
|
const findEventHandler = (element: ReactTestInstance, eventName: string) => {
|
|
const eventHandler = toEventHandlerName(eventName);
|
|
|
|
if (typeof element.props[eventHandler] === 'function') {
|
|
return element.props[eventHandler];
|
|
}
|
|
|
|
// Do not bubble event to the root element
|
|
if (element.parent === null || element.parent.parent === null) {
|
|
throw new ErrorWithStack(
|
|
`No handler function found for event: ${eventName}`,
|
|
invokeEvent
|
|
);
|
|
}
|
|
|
|
return findEventHandler(element.parent, eventName);
|
|
};
|
|
|
|
const invokeEvent = (
|
|
element: ReactTestInstance,
|
|
eventName: string,
|
|
data?: *
|
|
) => {
|
|
const handler = findEventHandler(element, eventName);
|
|
|
|
return handler(data);
|
|
};
|
|
|
|
const toEventHandlerName = (eventName: string) =>
|
|
`on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;
|
|
|
|
const pressHandler = (element: ReactTestInstance) =>
|
|
invokeEvent(element, 'press');
|
|
const changeTextHandler = (element: ReactTestInstance, data?: *) =>
|
|
invokeEvent(element, 'changeText', data);
|
|
const scrollHandler = (element: ReactTestInstance, data?: *) =>
|
|
invokeEvent(element, 'scroll', data);
|
|
|
|
const fireEvent = invokeEvent;
|
|
|
|
fireEvent.press = pressHandler;
|
|
fireEvent.changeText = changeTextHandler;
|
|
fireEvent.scroll = scrollHandler;
|
|
|
|
export default fireEvent;
|