diff --git a/src/__tests__/fireEvent.test.js b/src/__tests__/fireEvent.test.js index fa0b9c25..21b1258a 100644 --- a/src/__tests__/fireEvent.test.js +++ b/src/__tests__/fireEvent.test.js @@ -168,28 +168,28 @@ test('event with multiple handler parameters', () => { test('should not fire on disabled TouchableOpacity', () => { const handlePress = jest.fn(); const screen = render( - - Trigger - + + + Trigger + + ); - expect(() => fireEvent.press(screen.getByText('Trigger'))).toThrow( - 'No handler function found for event: "press"' - ); + fireEvent.press(screen.getByText('Trigger')); expect(handlePress).not.toHaveBeenCalled(); }); test('should not fire on disabled Pressable', () => { const handlePress = jest.fn(); const screen = render( - - Trigger - + + + Trigger + + ); - expect(() => fireEvent.press(screen.getByText('Trigger'))).toThrow( - 'No handler function found for event: "press"' - ); + fireEvent.press(screen.getByText('Trigger')); expect(handlePress).not.toHaveBeenCalled(); }); diff --git a/src/fireEvent.js b/src/fireEvent.js index c367679f..350a950e 100644 --- a/src/fireEvent.js +++ b/src/fireEvent.js @@ -6,30 +6,50 @@ const findEventHandler = ( element: ReactTestInstance, eventName: string, callsite?: any, - nearestHostDescendent?: ReactTestInstance + nearestHostDescendent?: ReactTestInstance, + hasDescendandHandler?: boolean ) => { + const handler = getEventHandler(element, eventName); + const hasHandler = handler != null || hasDescendandHandler; + const isHostComponent = typeof element.type === 'string'; const hostElement = isHostComponent ? element : nearestHostDescendent; const isEventEnabled = hostElement?.props.onStartShouldSetResponder?.() !== false; - - const eventHandlerName = toEventHandlerName(eventName); - - if (typeof element.props[eventHandlerName] === 'function' && isEventEnabled) { - return element.props[eventHandlerName]; - } else if (typeof element.props[eventName] === 'function' && isEventEnabled) { - return element.props[eventName]; - } + if (handler && isEventEnabled) return handler; // 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 - ); + if (hasHandler) { + return null; + } else { + throw new ErrorWithStack( + `No handler function found for event: "${eventName}"`, + callsite || invokeEvent + ); + } } - return findEventHandler(element.parent, eventName, callsite, hostElement); + return findEventHandler( + element.parent, + eventName, + callsite, + hostElement, + hasHandler + ); +}; + +const getEventHandler = (element: ReactTestInstance, eventName: string) => { + const eventHandlerName = toEventHandlerName(eventName); + if (typeof element.props[eventHandlerName] === 'function') { + return element.props[eventHandlerName]; + } + + if (typeof element.props[eventName] === 'function') { + return element.props[eventName]; + } + + return undefined; }; const invokeEvent = (