From c9965598e443814379b177bb00e2a7114e64e706 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Fri, 31 Jul 2020 07:56:34 +0200 Subject: [PATCH 1/4] updated tests --- src/__tests__/fireEvent.test.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/__tests__/fireEvent.test.js b/src/__tests__/fireEvent.test.js index fa0b9c255..505c70be9 100644 --- a/src/__tests__/fireEvent.test.js +++ b/src/__tests__/fireEvent.test.js @@ -173,9 +173,7 @@ test('should not fire on disabled TouchableOpacity', () => { ); - expect(() => fireEvent.press(screen.getByText('Trigger'))).toThrow( - 'No handler function found for event: "press"' - ); + expect(() => fireEvent.press(screen.getByText('Trigger'))).not.toThrow(); expect(handlePress).not.toHaveBeenCalled(); }); @@ -187,9 +185,7 @@ test('should not fire on disabled Pressable', () => { ); - expect(() => fireEvent.press(screen.getByText('Trigger'))).toThrow( - 'No handler function found for event: "press"' - ); + expect(() => fireEvent.press(screen.getByText('Trigger'))).not.toThrow(); expect(handlePress).not.toHaveBeenCalled(); }); From 8ca8fc1d6019aae6b258adb4d5ed9f258bdb41a2 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Fri, 31 Jul 2020 08:16:04 +0200 Subject: [PATCH 2/4] feat: implement behavior chage --- src/fireEvent.js | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/fireEvent.js b/src/fireEvent.js index c367679f5..c5c01ec3c 100644 --- a/src/fireEvent.js +++ b/src/fireEvent.js @@ -6,30 +6,48 @@ 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; + if (handler && isEventEnabled) return handler; - const eventHandlerName = toEventHandlerName(eventName); + // Do not bubble event to the root element + if (element.parent === null || element.parent.parent === null) { + if (hasHandler) return null; + else + throw new ErrorWithStack( + `No handler function found for event: "${eventName}"`, + callsite || invokeEvent + ); + } + + return findEventHandler( + element.parent, + eventName, + callsite, + hostElement, + hasHandler + ); +}; - if (typeof element.props[eventHandlerName] === 'function' && isEventEnabled) { +const getEventHandler = (element: ReactTestInstance, eventName: string) => { + const eventHandlerName = toEventHandlerName(eventName); + if (typeof element.props[eventHandlerName] === 'function') { return element.props[eventHandlerName]; - } else if (typeof element.props[eventName] === 'function' && isEventEnabled) { - 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 - ); + if (typeof element.props[eventName] === 'function') { + return element.props[eventName]; } - return findEventHandler(element.parent, eventName, callsite, hostElement); + return undefined; }; const invokeEvent = ( From 7d5f04ad37012d8c6162bc8d8659f28fab649d75 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Fri, 31 Jul 2020 09:47:53 +0200 Subject: [PATCH 3/4] code review changes --- src/__tests__/fireEvent.test.js | 4 ++-- src/fireEvent.js | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/__tests__/fireEvent.test.js b/src/__tests__/fireEvent.test.js index 505c70be9..d2dad6123 100644 --- a/src/__tests__/fireEvent.test.js +++ b/src/__tests__/fireEvent.test.js @@ -173,7 +173,7 @@ test('should not fire on disabled TouchableOpacity', () => { ); - expect(() => fireEvent.press(screen.getByText('Trigger'))).not.toThrow(); + fireEvent.press(screen.getByText('Trigger')); expect(handlePress).not.toHaveBeenCalled(); }); @@ -185,7 +185,7 @@ test('should not fire on disabled Pressable', () => { ); - expect(() => fireEvent.press(screen.getByText('Trigger'))).not.toThrow(); + fireEvent.press(screen.getByText('Trigger')); expect(handlePress).not.toHaveBeenCalled(); }); diff --git a/src/fireEvent.js b/src/fireEvent.js index c5c01ec3c..350a950e0 100644 --- a/src/fireEvent.js +++ b/src/fireEvent.js @@ -20,12 +20,14 @@ const findEventHandler = ( // Do not bubble event to the root element if (element.parent === null || element.parent.parent === null) { - if (hasHandler) return null; - else + if (hasHandler) { + return null; + } else { throw new ErrorWithStack( `No handler function found for event: "${eventName}"`, callsite || invokeEvent ); + } } return findEventHandler( From 1eaf07e5b5b684327c8a8d3d072d5b4147d5c604 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Fri, 31 Jul 2020 10:29:46 +0200 Subject: [PATCH 4/4] refactor: more strict test conditions --- src/__tests__/fireEvent.test.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/__tests__/fireEvent.test.js b/src/__tests__/fireEvent.test.js index d2dad6123..21b1258ab 100644 --- a/src/__tests__/fireEvent.test.js +++ b/src/__tests__/fireEvent.test.js @@ -168,9 +168,11 @@ test('event with multiple handler parameters', () => { test('should not fire on disabled TouchableOpacity', () => { const handlePress = jest.fn(); const screen = render( - - Trigger - + + + Trigger + + ); fireEvent.press(screen.getByText('Trigger')); @@ -180,9 +182,11 @@ test('should not fire on disabled TouchableOpacity', () => { test('should not fire on disabled Pressable', () => { const handlePress = jest.fn(); const screen = render( - - Trigger - + + + Trigger + + ); fireEvent.press(screen.getByText('Trigger'));