Skip to content

Commit 7fa6eb0

Browse files
authored
Merge branch 'callstack:main' into docs/cookbook/net-reqs
2 parents 4a2fb86 + 856332c commit 7fa6eb0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+682
-708
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"cSpell.words": ["Pressable", "RNTL", "Uncapitalize"]
2+
"cSpell.words": ["labelledby", "Pressable", "RNTL", "Uncapitalize", "valuenow", "valuetext"]
33
}

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@testing-library/react-native",
3-
"version": "12.6.0",
3+
"version": "12.6.1",
44
"description": "Simple and complete React Native testing utilities that encourage good testing practices.",
55
"main": "build/index.js",
66
"types": "build/index.d.ts",
@@ -70,7 +70,7 @@
7070
"@babel/preset-flow": "^7.24.7",
7171
"@babel/preset-react": "^7.24.7",
7272
"@babel/preset-typescript": "^7.24.7",
73-
"@callstack/eslint-config": "^14.2.0",
73+
"@callstack/eslint-config": "^15.0.0",
7474
"@release-it/conventional-changelog": "^8.0.1",
7575
"@relmify/jest-serializer-strip-ansi": "^1.0.2",
7676
"@types/jest": "^29.5.12",

src/__tests__/fire-event.test.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
View,
1010
} from 'react-native';
1111
import { fireEvent, render, screen } from '..';
12+
import '../matchers/extend-expect';
1213

1314
type OnPressComponentProps = {
1415
onPress: () => void;
@@ -139,17 +140,26 @@ test('fireEvent.scroll', () => {
139140

140141
test('fireEvent.changeText', () => {
141142
const onChangeTextMock = jest.fn();
142-
const CHANGE_TEXT = 'content';
143143

144144
render(
145145
<View>
146146
<TextInput placeholder="Customer placeholder" onChangeText={onChangeTextMock} />
147147
</View>,
148148
);
149149

150-
fireEvent.changeText(screen.getByPlaceholderText('Customer placeholder'), CHANGE_TEXT);
150+
const input = screen.getByPlaceholderText('Customer placeholder');
151+
fireEvent.changeText(input, 'content');
152+
expect(onChangeTextMock).toHaveBeenCalledWith('content');
153+
});
154+
155+
it('sets native state value for unmanaged text inputs', () => {
156+
render(<TextInput testID="input" />);
157+
158+
const input = screen.getByTestId('input');
159+
expect(input).toHaveDisplayValue('');
151160

152-
expect(onChangeTextMock).toHaveBeenCalledWith(CHANGE_TEXT);
161+
fireEvent.changeText(input, 'abc');
162+
expect(input).toHaveDisplayValue('abc');
153163
});
154164

155165
test('custom component with custom event name', () => {

src/__tests__/render-hook.test.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { ReactNode } from 'react';
22
import TestRenderer from 'react-test-renderer';
33
import { renderHook } from '../pure';
44

5-
test('gives comitted result', () => {
5+
test('gives committed result', () => {
66
const { result } = renderHook(() => {
77
const [state, setState] = React.useState(1);
88

@@ -22,13 +22,11 @@ test('allows rerendering', () => {
2222
const [left, setLeft] = React.useState('left');
2323
const [right, setRight] = React.useState('right');
2424

25-
// eslint-disable-next-line jest/no-if
2625
switch (props.branch) {
2726
case 'left':
2827
return [left, setLeft];
2928
case 'right':
3029
return [right, setRight];
31-
3230
default:
3331
throw new Error('No Props passed. This is a bug in the implementation');
3432
}
@@ -64,7 +62,7 @@ const useMyHook = (param: number | undefined) => {
6462
return param;
6563
};
6664

67-
test('props type is infered correctly when initial props is defined', () => {
65+
test('props type is inferred correctly when initial props is defined', () => {
6866
const { result, rerender } = renderHook((num: number | undefined) => useMyHook(num), {
6967
initialProps: 5,
7068
});

src/__tests__/wait-for-element-to-be-removed.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ test('waits with custom interval', async () => {
114114
timeout: 600,
115115
interval: 200,
116116
});
117-
} catch (e) {
117+
} catch {
118118
// Suppress expected error
119119
}
120120

@@ -133,7 +133,7 @@ test.each([false, true])(
133133
timeout: 400,
134134
interval: 200,
135135
});
136-
} catch (e) {
136+
} catch {
137137
// Suppress expected error
138138
}
139139

src/__tests__/wait-for.test.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ test('waits for element with custom interval', async () => {
9191

9292
try {
9393
await waitFor(() => mockFn(), { timeout: 400, interval: 200 });
94-
} catch (e) {
94+
} catch {
9595
// suppress
9696
}
9797

@@ -160,7 +160,7 @@ test.each([false, true])(
160160

161161
try {
162162
await waitFor(() => mockFn(), { timeout: 400, interval: 200 });
163-
} catch (error) {
163+
} catch {
164164
// suppress
165165
}
166166

@@ -185,7 +185,7 @@ test.each([false, true])(
185185
interval: 200,
186186
onTimeout: mockHandleFn,
187187
});
188-
} catch (error) {
188+
} catch {
189189
// suppress
190190
}
191191

@@ -248,7 +248,7 @@ test.each([false, true])(
248248

249249
try {
250250
await waitFor(() => mockFn(), { timeout: 400, interval: 200 });
251-
} catch (error) {
251+
} catch {
252252
// suppress
253253
}
254254

src/cleanup.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
import * as React from 'react';
1+
import { clearNativeState } from './native-state';
22
import { clearRenderResult } from './screen';
33

4-
type CleanUpFunction = (nextElement?: React.ReactElement<any>) => void;
5-
let cleanupQueue = new Set<CleanUpFunction>();
4+
type CleanUpFunction = () => void;
5+
6+
const cleanupQueue = new Set<CleanUpFunction>();
67

78
export default function cleanup() {
9+
clearNativeState();
810
clearRenderResult();
11+
912
cleanupQueue.forEach((fn) => fn());
1013
cleanupQueue.clear();
1114
}

src/fire-event.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { isHostTextInput } from './helpers/host-component-names';
1212
import { isPointerEventEnabled } from './helpers/pointer-events';
1313
import { isTextInputEditable } from './helpers/text-input';
1414
import { StringWithAutocomplete } from './types';
15+
import { nativeState } from './native-state';
1516

1617
type EventHandler = (...args: unknown[]) => unknown;
1718

@@ -120,6 +121,8 @@ type EventName = StringWithAutocomplete<
120121
>;
121122

122123
function fireEvent(element: ReactTestInstance, eventName: EventName, ...data: unknown[]) {
124+
setNativeStateIfNeeded(element, eventName, data[0]);
125+
123126
const handler = findEventHandler(element, eventName);
124127
if (!handler) {
125128
return;
@@ -143,3 +146,14 @@ fireEvent.scroll = (element: ReactTestInstance, ...data: unknown[]) =>
143146
fireEvent(element, 'scroll', ...data);
144147

145148
export default fireEvent;
149+
150+
function setNativeStateIfNeeded(element: ReactTestInstance, eventName: string, value: unknown) {
151+
if (
152+
eventName === 'changeText' &&
153+
typeof value === 'string' &&
154+
isHostTextInput(element) &&
155+
isTextInputEditable(element)
156+
) {
157+
nativeState?.valueForElement.set(element, value);
158+
}
159+
}

0 commit comments

Comments
 (0)