diff --git a/src/__tests__/fireEvent.test.js b/src/__tests__/fireEvent.test.js index a8f1ac43d..90cb60e06 100644 --- a/src/__tests__/fireEvent.test.js +++ b/src/__tests__/fireEvent.test.js @@ -234,6 +234,83 @@ test('should not fire on non-editable TextInput with nested Text', () => { expect(onChangeTextMock).not.toHaveBeenCalled(); }); +test('should not fire on none pointerEvents View', () => { + const handlePress = jest.fn(); + + const screen = render( + + + Trigger + + + ); + + fireEvent.press(screen.getByText('Trigger')); + expect(handlePress).not.toHaveBeenCalled(); +}); + +test('should not fire on box-only pointerEvents View', () => { + const handlePress = jest.fn(); + + const screen = render( + + + Trigger + + + ); + + fireEvent.press(screen.getByText('Trigger')); + expect(handlePress).not.toHaveBeenCalled(); +}); + +test('should fire on box-none pointerEvents View', () => { + const handlePress = jest.fn(); + + const screen = render( + + + Trigger + + + ); + + fireEvent.press(screen.getByText('Trigger')); + expect(handlePress).toHaveBeenCalled(); +}); + +test('should fire on auto pointerEvents View', () => { + const handlePress = jest.fn(); + + const screen = render( + + + Trigger + + + ); + + fireEvent.press(screen.getByText('Trigger')); + expect(handlePress).toHaveBeenCalled(); +}); + +test('should not fire on box-only pointerEvents View with nested elements', () => { + const handlePress = jest.fn(); + + const screen = render( + + + + Trigger + + + + ); + + fireEvent.press(screen.getByText('Trigger')); + expect(handlePress).not.toHaveBeenCalled(); +}); + test('should pass event up on disabled TouchableOpacity', () => { const handleInnerPress = jest.fn(); const handleOuterPress = jest.fn(); diff --git a/src/fireEvent.js b/src/fireEvent.js index dcc49d81c..18c938e7d 100644 --- a/src/fireEvent.js +++ b/src/fireEvent.js @@ -17,11 +17,29 @@ const isTouchResponder = (element?: ReactTestInstance) => { return !!element?.props.onStartShouldSetResponder || isTextInput(element); }; +const isPointerEventEnabled = ( + element?: ReactTestInstance, + isParent?: boolean +) => { + const parentCondition = isParent + ? element?.props.pointerEvents === 'box-only' + : element?.props.pointerEvents === 'box-none'; + + if (element?.props.pointerEvents === 'none' || parentCondition) { + return false; + } + + if (!element?.parent) return true; + + return isPointerEventEnabled(element.parent, true); +}; + const isEventEnabled = ( element?: ReactTestInstance, touchResponder?: ReactTestInstance ) => { if (isTextInput(element)) return element?.props.editable !== false; + if (!isPointerEventEnabled(element)) return false; const touchStart = touchResponder?.props.onStartShouldSetResponder?.(); const touchMove = touchResponder?.props.onMoveShouldSetResponder?.();