Files
callstack__react-native-tes…/src/fireEvent.js
T
2019-07-16 16:19:59 +02:00

71 lines
1.8 KiB
JavaScript

// @flow
import act from './act';
import { ErrorWithStack } from './helpers/errors';
const findEventHandler = (
element: ReactTestInstance,
eventName: string,
callsite?: any
) => {
const eventHandler = toEventHandlerName(eventName);
if (typeof element.props[eventHandler] === 'function') {
return element.props[eventHandler];
} else if (typeof element.props[eventName] === 'function') {
return element.props[eventName];
}
// 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}"`,
callsite || invokeEvent
);
}
return findEventHandler(element.parent, eventName, callsite);
};
const invokeEvent = (
element: ReactTestInstance,
eventName: string,
callsite?: any,
...data: Array<any>
) => {
const handler = findEventHandler(element, eventName, callsite);
if (!handler) {
return null;
}
let returnValue;
act(() => {
returnValue = handler(...data);
});
return returnValue;
};
const toEventHandlerName = (eventName: string) =>
`on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;
const pressHandler = (element: ReactTestInstance) =>
invokeEvent(element, 'press', pressHandler);
const changeTextHandler = (element: ReactTestInstance, ...data: Array<any>) =>
invokeEvent(element, 'changeText', changeTextHandler, ...data);
const scrollHandler = (element: ReactTestInstance, ...data: Array<any>) =>
invokeEvent(element, 'scroll', scrollHandler, ...data);
const fireEvent = (
element: ReactTestInstance,
eventName: string,
...data: Array<any>
) => invokeEvent(element, eventName, fireEvent, ...data);
fireEvent.press = pressHandler;
fireEvent.changeText = changeTextHandler;
fireEvent.scroll = scrollHandler;
export default fireEvent;