2018-10-07 08:23:21 +02:00
|
|
|
// @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];
|
|
|
|
|
}
|
|
|
|
|
|
2018-10-15 17:03:30 +02:00
|
|
|
// Do not bubble event to the root element
|
|
|
|
|
if (element.parent === null || element.parent.parent === null) {
|
2018-10-07 08:23:21 +02:00
|
|
|
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;
|
|
|
|
|
|
2018-10-07 14:50:05 +02:00
|
|
|
fireEvent.press = pressHandler;
|
|
|
|
|
fireEvent.changeText = changeTextHandler;
|
|
|
|
|
fireEvent.scroll = scrollHandler;
|
2018-10-07 08:23:21 +02:00
|
|
|
|
|
|
|
|
export default fireEvent;
|