From d8a47f27cef273efe689936e67c0d0d3950035f7 Mon Sep 17 00:00:00 2001 From: Panagiotis Plytas Date: Sat, 22 Aug 2020 17:34:12 +0300 Subject: [PATCH 1/2] test: Add tests for non-editable TextInput --- src/__tests__/fireEvent.test.js | 40 +++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/__tests__/fireEvent.test.js b/src/__tests__/fireEvent.test.js index 21b1258ab..74d97aa9e 100644 --- a/src/__tests__/fireEvent.test.js +++ b/src/__tests__/fireEvent.test.js @@ -193,6 +193,46 @@ test('should not fire on disabled Pressable', () => { expect(handlePress).not.toHaveBeenCalled(); }); +test('should not fire on non-editable TextInput', () => { + const placeholder = 'Test placeholder'; + const onChangeTextMock = jest.fn(); + const NEW_TEXT = 'New text'; + + const { getByPlaceholderText } = render( + + + + ); + + fireEvent.changeText(getByPlaceholderText(placeholder), NEW_TEXT); + expect(onChangeTextMock).not.toHaveBeenCalled(); +}); + +test('should not fire on non-editable TextInput with nested Text', () => { + const placeholder = 'Test placeholder'; + const onChangeTextMock = jest.fn(); + const NEW_TEXT = 'New text'; + + const { getByPlaceholderText } = render( + + + Test text + + + ); + + fireEvent.changeText(getByPlaceholderText(placeholder), NEW_TEXT); + expect(onChangeTextMock).not.toHaveBeenCalled(); +}); + test('should pass event up on disabled TouchableOpacity', () => { const handleInnerPress = jest.fn(); const handleOuterPress = jest.fn(); From 95b397a59ee6977136c21493bde4833a4e2ac2da Mon Sep 17 00:00:00 2001 From: Panagiotis Plytas Date: Sat, 22 Aug 2020 17:35:13 +0300 Subject: [PATCH 2/2] feat: use editable prop to check for event handling --- src/fireEvent.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/fireEvent.js b/src/fireEvent.js index 350a950e0..08b9a65ec 100644 --- a/src/fireEvent.js +++ b/src/fireEvent.js @@ -2,6 +2,12 @@ import act from './act'; import { ErrorWithStack } from './helpers/errors'; +const isTextInputComponent = (element: ReactTestInstance) => { + // eslint-disable-next-line import/no-extraneous-dependencies + const { TextInput } = require('react-native'); + return element.type === TextInput; +}; + const findEventHandler = ( element: ReactTestInstance, eventName: string, @@ -14,8 +20,11 @@ const findEventHandler = ( const isHostComponent = typeof element.type === 'string'; const hostElement = isHostComponent ? element : nearestHostDescendent; - const isEventEnabled = - hostElement?.props.onStartShouldSetResponder?.() !== false; + + const isEventEnabled = isTextInputComponent(element) + ? element.props.editable !== false + : hostElement?.props.onStartShouldSetResponder?.() !== false; + if (handler && isEventEnabled) return handler; // Do not bubble event to the root element