Skip to content

Commit eeee8f7

Browse files
author
Pontus Lundin
committed
make onPress behave more life-like
1 parent 8021f09 commit eeee8f7

File tree

2 files changed

+121
-4
lines changed

2 files changed

+121
-4
lines changed

src/__tests__/fireEvent.test.js

+95-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,22 @@ import {
1111
} from 'react-native';
1212
import { render, fireEvent } from '..';
1313

14-
const OnPressComponent = ({ onPress, text }) => (
14+
const OnPressComponent = ({
15+
onPress,
16+
onLongPress,
17+
onPressIn,
18+
onPressOut,
19+
onFocus,
20+
text,
21+
}) => (
1522
<View>
16-
<TouchableOpacity onPress={onPress}>
23+
<TouchableOpacity
24+
onPress={onPress}
25+
onLongPress={onLongPress}
26+
onPressIn={onPressIn}
27+
onPressOut={onPressOut}
28+
onFocus={onFocus}
29+
>
1730
<Text>{text}</Text>
1831
</TouchableOpacity>
1932
</View>
@@ -100,6 +113,86 @@ test('fireEvent.press', () => {
100113
expect(onPressMock).toHaveBeenCalled();
101114
});
102115

116+
test('fireEvent.press all events', () => {
117+
const callOrder = [];
118+
const onPressInMock = jest.fn(() => callOrder.push('onPressIn'));
119+
const onPressOutMock = jest.fn(() => callOrder.push('onPressOut'));
120+
const onPressMock = jest.fn(() => callOrder.push('onPress'));
121+
const onFocusMock = jest.fn(() => callOrder.push('onFocus'));
122+
const onLongPressMock = jest.fn();
123+
const text = 'Fireevent press';
124+
const { getByText } = render(
125+
<OnPressComponent
126+
onPress={onPressMock}
127+
onLongPress={onLongPressMock}
128+
onPressIn={onPressInMock}
129+
onPressOut={onPressOutMock}
130+
onFocus={onFocusMock}
131+
text={text}
132+
/>
133+
);
134+
135+
fireEvent.press(getByText(text));
136+
137+
expect(onLongPressMock).not.toHaveBeenCalled();
138+
expect(onPressInMock).toHaveBeenCalled();
139+
expect(onPressOutMock).toHaveBeenCalled();
140+
expect(onPressMock).toHaveBeenCalled();
141+
expect(onFocusMock).toHaveBeenCalled();
142+
expect(callOrder).toStrictEqual([
143+
'onPressIn',
144+
'onPressOut',
145+
'onPress',
146+
'onFocus',
147+
]);
148+
});
149+
150+
test('fireEvent.longPress', () => {
151+
const onLongPressMock = jest.fn();
152+
const text = 'Fireevent longpress';
153+
const { getByText } = render(
154+
<OnPressComponent onLongPress={onLongPressMock} text={text} />
155+
);
156+
157+
fireEvent.longPress(getByText(text));
158+
159+
expect(onLongPressMock).toHaveBeenCalled();
160+
});
161+
162+
test('fireEvent.longPress all events', () => {
163+
const callOrder = [];
164+
const onPressInMock = jest.fn(() => callOrder.push('onPressIn'));
165+
const onLongPressMock = jest.fn(() => callOrder.push('onLongPress'));
166+
const onPressOutMock = jest.fn(() => callOrder.push('onPressOut'));
167+
const onPressMock = jest.fn();
168+
const onFocusMock = jest.fn(() => callOrder.push('onFocus'));
169+
const text = 'Fireevent longpress';
170+
const { getByText } = render(
171+
<OnPressComponent
172+
onPress={onPressMock}
173+
onLongPress={onLongPressMock}
174+
onPressIn={onPressInMock}
175+
onPressOut={onPressOutMock}
176+
onFocus={onFocusMock}
177+
text={text}
178+
/>
179+
);
180+
181+
fireEvent.longPress(getByText(text));
182+
183+
expect(onPressInMock).toHaveBeenCalled();
184+
expect(onLongPressMock).toHaveBeenCalled();
185+
expect(onPressOutMock).toHaveBeenCalled();
186+
expect(onPressMock).not.toHaveBeenCalled();
187+
expect(onFocusMock).toHaveBeenCalled();
188+
expect(callOrder).toStrictEqual([
189+
'onPressIn',
190+
'onLongPress',
191+
'onPressOut',
192+
'onFocus',
193+
]);
194+
});
195+
103196
test('fireEvent.scroll', () => {
104197
const onScrollMock = jest.fn();
105198
const eventData = {

src/fireEvent.js

+26-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ const isHostElement = (element?: ReactTestInstance) => {
55
return typeof element?.type === 'string';
66
};
77

8+
const isFocused = (element?: ReactTestInstance) => {
9+
return element?._component?.isFocused?.();
10+
};
11+
812
const isTextInput = (element?: ReactTestInstance) => {
913
const { TextInput } = require('react-native');
1014
return element?.type === TextInput;
@@ -105,8 +109,27 @@ const invokeEvent = (
105109
const toEventHandlerName = (eventName: string) =>
106110
`on${eventName.charAt(0).toUpperCase()}${eventName.slice(1)}`;
107111

108-
const pressHandler = (element: ReactTestInstance): void =>
109-
invokeEvent(element, 'press', pressHandler);
112+
const pressHandler = (
113+
element: ReactTestInstance,
114+
isLongPress: boolean
115+
): void => {
116+
invokeEvent(element, 'pressIn', pressHandler);
117+
if (isLongPress) {
118+
invokeEvent(element, 'longPress', pressHandler);
119+
invokeEvent(element, 'pressOut', pressHandler);
120+
} else {
121+
invokeEvent(element, 'pressOut', pressHandler);
122+
invokeEvent(element, 'press', pressHandler);
123+
}
124+
125+
if (!isFocused(element)) {
126+
invokeEvent(element, 'focus', pressHandler);
127+
}
128+
};
129+
130+
const longPressHandler = (element: ReactTestInstance): void =>
131+
pressHandler(element, true);
132+
110133
const changeTextHandler = (
111134
element: ReactTestInstance,
112135
...data: Array<any>
@@ -121,6 +144,7 @@ const fireEvent = (
121144
): void => invokeEvent(element, eventName, fireEvent, ...data);
122145

123146
fireEvent.press = pressHandler;
147+
fireEvent.longPress = longPressHandler;
124148
fireEvent.changeText = changeTextHandler;
125149
fireEvent.scroll = scrollHandler;
126150

0 commit comments

Comments
 (0)