2018-10-07 08:23:21 +02:00
|
|
|
// @flow
|
2019-02-28 21:53:26 +01:00
|
|
|
import act from './act';
|
2018-11-17 19:13:44 +01:00
|
|
|
import { ErrorWithStack } from './helpers/errors';
|
2018-10-07 08:23:21 +02:00
|
|
|
|
2019-05-30 12:21:35 +02:00
|
|
|
const findEventHandler = (
|
|
|
|
|
element: ReactTestInstance,
|
|
|
|
|
eventName: string,
|
|
|
|
|
callsite?: any
|
|
|
|
|
) => {
|
2018-10-07 08:23:21 +02:00
|
|
|
const eventHandler = toEventHandlerName(eventName);
|
|
|
|
|
|
|
|
|
|
if (typeof element.props[eventHandler] === 'function') {
|
|
|
|
|
return element.props[eventHandler];
|
2019-04-09 15:37:15 +02:00
|
|
|
} else if (typeof element.props[eventName] === 'function') {
|
|
|
|
|
return element.props[eventName];
|
2018-10-07 08:23:21 +02:00
|
|
|
}
|
|
|
|
|
|
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(
|
2019-05-30 12:21:35 +02:00
|
|
|
`No handler function found for event: "${eventName}"`,
|
|
|
|
|
callsite || invokeEvent
|
2018-10-07 08:23:21 +02:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-30 12:21:35 +02:00
|
|
|
return findEventHandler(element.parent, eventName, callsite);
|
2018-10-07 08:23:21 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const invokeEvent = (
|
|
|
|
|
element: ReactTestInstance,
|
|
|
|
|
eventName: string,
|
2019-05-30 12:21:35 +02:00
|
|
|
data?: any,
|
|
|
|
|
callsite?: any
|
|
|
|
|
) => {
|
|
|
|
|
const handler = findEventHandler(element, eventName, callsite);
|
|
|
|
|
|
|
|
|
|
if (!handler) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2018-10-07 08:23:21 +02:00
|
|
|
|
2019-02-28 21:53:26 +01:00
|
|
|
let returnValue;
|
|
|
|
|
|
|
|
|
|
act(() => {
|
|
|
|
|
returnValue = handler(data);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return returnValue;
|
2018-10-07 08:23:21 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const toEventHandlerName = (eventName: string) =>
|
|
|
|
|
`on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;
|
|
|
|
|
|
|
|
|
|
const pressHandler = (element: ReactTestInstance) =>
|
2019-05-30 12:21:35 +02:00
|
|
|
invokeEvent(element, 'press', undefined, pressHandler);
|
2018-10-07 08:23:21 +02:00
|
|
|
const changeTextHandler = (element: ReactTestInstance, data?: *) =>
|
2019-05-30 12:21:35 +02:00
|
|
|
invokeEvent(element, 'changeText', data, changeTextHandler);
|
2018-10-07 08:23:21 +02:00
|
|
|
const scrollHandler = (element: ReactTestInstance, data?: *) =>
|
2019-05-30 12:21:35 +02:00
|
|
|
invokeEvent(element, 'scroll', data, scrollHandler);
|
2018-10-07 08:23:21 +02:00
|
|
|
|
|
|
|
|
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;
|