Skip to content

Commit 29251aa

Browse files
chore: v14 RC preparations (#1906)
1 parent 8ed8efc commit 29251aa

19 files changed

Lines changed: 342 additions & 33 deletions

File tree

CHANGELOG.md

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# Changelog
2+
3+
All notable changes to React Native Testing Library will be documented in this file, starting
4+
with v14.
5+
6+
## 14.0.0
7+
8+
### Migration guide
9+
10+
See the [Migration to 14.x](./website/docs/14.x/docs/start/migration-v14.mdx) guide for
11+
step-by-step upgrade instructions, codemods, and before/after examples.
12+
13+
### Breaking changes
14+
15+
- Dropped support for React 18. React 19.0.0 or newer is now required.
16+
- Raised the minimum supported React Native version to 0.78.
17+
- Raised the minimum supported Node.js version to `^22.13.0 || >=24`.
18+
- Replaced the deprecated React Test Renderer with
19+
[Test Renderer](https://github.com/mdjastrzebski/test-renderer).
20+
- Added a peer dependency on Test Renderer 1.x. Install the Test Renderer compatibility line
21+
that matches your React 19 minor version.
22+
- Made the core rendering and event APIs async by default:
23+
- `render()` now returns `Promise<RenderResult>`.
24+
- `renderHook()` now returns `Promise<RenderHookResult>`.
25+
- `fireEvent()` and its helpers now return `Promise<void>`.
26+
- `act()` now always returns a Promise and should always be awaited.
27+
- Removed the `renderAsync`, `renderHookAsync`, and `fireEventAsync` APIs. Use `render`,
28+
`renderHook`, and `fireEvent` instead.
29+
- Removed the `update` alias. Use `rerender` instead.
30+
- Removed the `getQueriesForElement` alias. Use `within` instead.
31+
- Removed `UNSAFE_root`. Use `container` for the pseudo-element container or `root` for
32+
the first rendered host element.
33+
- Removed legacy `UNSAFE_*` queries:
34+
- `UNSAFE_getAllByType`
35+
- `UNSAFE_getByType`
36+
- `UNSAFE_getAllByProps`
37+
- `UNSAFE_getByProps`
38+
- Removed the `concurrentRoot` render and configuration option. Concurrent rendering is
39+
always enabled in v14.
40+
- Removed the `createNodeMock` render option, which is not supported by the new Test Renderer
41+
integration.
42+
- Removed the `unstable_validateStringsRenderedWithinText` render option. Text string
43+
validation is now always enabled.
44+
45+
### Notable changes
46+
47+
- Reintroduced the `container` API as a safe pseudo-element container, aligned with React
48+
Testing Library semantics.
49+
- Query results and the rendered element tree now expose host elements only. Composite
50+
components are no longer visible through the test tree.
51+
- Type definitions now use `TestInstance` from Test Renderer instead of
52+
`ReactTestInstance` from React Test Renderer.
53+
- Suspended or hidden instances are now represented with React Native-like hidden props, such
54+
as `display: 'none'`, so visibility queries and matchers behave closer to runtime behavior.
55+
- `fireEvent.press()` and `fireEvent.scroll()` now pass default synthetic native event objects
56+
to handlers and deep-merge any event props supplied by the test.
57+
- Accessible name calculation now follows React Native inputs more closely, including
58+
`TextInput` placeholder handling, child accessible name concatenation, and stricter
59+
`getByRole(..., { name })` matching.
60+
- `configure`, `render`, `renderHook`, and `userEvent.setup` now warn when unknown options are
61+
passed, helping catch stale or misspelled options during migration.
62+
- Text strings rendered outside of React Native `<Text>` components now throw, matching
63+
React Native runtime behavior.
64+
65+
### Test Renderer versions
66+
67+
Install the Test Renderer version that matches your React 19 minor version:
68+
69+
| React version | Recommended Test Renderer version |
70+
| ------------- | --------------------------------- |
71+
| `19.2` | `test-renderer@1.2` |
72+
| `19.1` | `test-renderer@1.1` |
73+
| `19.0` | `test-renderer@1.0` |
74+
75+
Older Test Renderer lines may not support newer React 19 features in tests. Newer Test
76+
Renderer lines can produce peer dependency warnings, or an install error with `npm`. See the
77+
[Test Renderer React 19 compatibility lines](https://github.com/mdjastrzebski/test-renderer#react-19-compatibility-lines)
78+
for the latest recommendations.
79+
80+
### Codemods
81+
82+
Two codemods are available to automate the most common v14 upgrade work:
83+
84+
- `rntl-v14-update-deps` updates dependencies by removing React Test Renderer packages,
85+
adding Test Renderer, and updating React Native Testing Library.
86+
- `rntl-v14-async-functions` updates test code for async `render`, `renderHook`, `fireEvent`,
87+
`act`, `rerender`, and `unmount` usage.
88+
89+
### Full changelog
90+
91+
See the full GitHub comparison:
92+
https://github.com/callstack/react-native-testing-library/compare/v13.3.3...v14.0.0

codemods/v14-update-deps/README.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ This codemod automatically updates your `package.json` to prepare for React Nati
66

77
- Removes `@types/react-test-renderer` and `react-test-renderer` (no longer needed)
88
- Moves `@testing-library/react-native` to `devDependencies` if it's in `dependencies`
9-
- Updates `@testing-library/react-native` to `^14.0.0-beta.0`
10-
- Adds `test-renderer@^1.0.0` to `devDependencies`
9+
- Updates `@testing-library/react-native` to `^14.0.0-0`
10+
- Adds `test-renderer` to `devDependencies`, using the matching React 19 compatibility line when it can infer one:
11+
- React 19.0: `test-renderer@^1.0.0`
12+
- React 19.1: `test-renderer@^1.1.0`
13+
- React 19.2: `test-renderer@^1.2.0`
14+
- Missing or ambiguous React version: `test-renderer@^1.2.0`
1115

1216
## Usage
1317

@@ -37,8 +41,8 @@ npx codemod@latest run rntl-v14-update-deps --target ./path/to/your/project
3741
```json
3842
{
3943
"devDependencies": {
40-
"@testing-library/react-native": "^14.0.0-beta.0",
41-
"test-renderer": "^1.0.0"
44+
"@testing-library/react-native": "^14.0.0-0",
45+
"test-renderer": "^1.2.0"
4246
}
4347
}
4448
```
@@ -50,7 +54,7 @@ npx codemod@latest run rntl-v14-update-deps --target ./path/to/your/project
5054
npm install
5155
# or yarn install / pnpm install
5256
```
53-
- The codemod sets the version to `^14.0.0-beta.0`. You can manually update this if needed.
57+
- The codemod sets the version to `^14.0.0-0`. You can manually update this if needed.
5458
- For monorepos, the codemod processes each `package.json` file individually.
5559

5660
## Next steps

codemods/v14-update-deps/scripts/codemod.ts

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33
import type { Transform } from 'codemod:ast-grep';
44
import type JSONLang from 'codemod:ast-grep/langs/json';
55

6-
const RNTL_VERSION = '^14.0.0-beta.0';
7-
const TEST_RENDERER_VERSION = '^1.0.0';
6+
const RNTL_VERSION = '^14.0.0-0';
7+
const TEST_RENDERER_FALLBACK_VERSION = '^1.2.0';
8+
const TEST_RENDERER_VERSION_BY_REACT_MINOR: Record<string, string> = {
9+
'19.0': '^1.0.0',
10+
'19.1': '^1.1.0',
11+
'19.2': '^1.2.0',
12+
};
813

914
interface PackageJson {
1015
dependencies?: Record<string, string>;
@@ -141,10 +146,44 @@ function ensureRntlInDevDependencies(packageJson: PackageJson): boolean {
141146
}
142147

143148
function updateTestRendererVersionInDevDependencies(packageJson: PackageJson): boolean {
149+
const expectedVersion = getTestRendererVersion(packageJson);
144150
const currentVersion = packageJson.devDependencies?.['test-renderer'];
145-
if (currentVersion !== TEST_RENDERER_VERSION) {
146-
packageJson.devDependencies!['test-renderer'] = TEST_RENDERER_VERSION;
151+
if (currentVersion !== expectedVersion) {
152+
packageJson.devDependencies!['test-renderer'] = expectedVersion;
147153
return true;
148154
}
149155
return false;
150156
}
157+
158+
function getTestRendererVersion(packageJson: PackageJson): string {
159+
const reactVersion = getPackageVersion(packageJson, 'react');
160+
const reactMinor = reactVersion ? getKnownReact19Minor(reactVersion) : null;
161+
162+
return reactMinor
163+
? TEST_RENDERER_VERSION_BY_REACT_MINOR[reactMinor]
164+
: TEST_RENDERER_FALLBACK_VERSION;
165+
}
166+
167+
function getPackageVersion(packageJson: PackageJson, pkgName: string): string | undefined {
168+
for (const depType of [
169+
'dependencies',
170+
'devDependencies',
171+
'peerDependencies',
172+
'optionalDependencies',
173+
] as const) {
174+
const version = packageJson[depType]?.[pkgName];
175+
if (version) {
176+
return version;
177+
}
178+
}
179+
180+
return undefined;
181+
}
182+
183+
function getKnownReact19Minor(version: string): string | null {
184+
const trimmedVersion = version.trim();
185+
const exactVersionMatch = trimmedVersion.match(/^=?~?(19\.(?:0|1|2))(?:\.\d+)?(?:-[\w.-]+)?$/);
186+
const xRangeMatch = trimmedVersion.match(/^~?(19\.(?:0|1|2))\.(?:x|\*)$/i);
187+
188+
return exactVersionMatch?.[1] ?? xRangeMatch?.[1] ?? null;
189+
}

codemods/v14-update-deps/tests/fixtures/already-alpha/expected.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "test-project",
33
"version": "1.0.0",
44
"devDependencies": {
5-
"@testing-library/react-native": "^14.0.0-beta.0",
6-
"test-renderer": "^1.0.0"
5+
"@testing-library/react-native": "^14.0.0-0",
6+
"test-renderer": "^1.2.0"
77
}
88
}

codemods/v14-update-deps/tests/fixtures/basic-update/expected.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "test-project",
33
"version": "1.0.0",
44
"devDependencies": {
5-
"@testing-library/react-native": "^14.0.0-beta.0",
6-
"test-renderer": "^1.0.0"
5+
"@testing-library/react-native": "^14.0.0-0",
6+
"test-renderer": "^1.2.0"
77
}
88
}

codemods/v14-update-deps/tests/fixtures/move-from-deps/expected.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "test-project",
33
"version": "1.0.0",
44
"devDependencies": {
5-
"@testing-library/react-native": "^14.0.0-beta.0",
6-
"test-renderer": "^1.0.0"
5+
"@testing-library/react-native": "^14.0.0-0",
6+
"test-renderer": "^1.2.0"
77
}
88
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"dependencies": {
3+
"react": "19.0.0"
4+
},
5+
"devDependencies": {
6+
"@testing-library/react-native": "^14.0.0-0",
7+
"test-renderer": "^1.0.0"
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"dependencies": {
3+
"@testing-library/react-native": "^13.0.0",
4+
"react": "19.0.0"
5+
},
6+
"devDependencies": {
7+
"react-test-renderer": "19.0.0"
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"dependencies": {
3+
"react": "~19.1.0"
4+
},
5+
"devDependencies": {
6+
"@testing-library/react-native": "^14.0.0-0",
7+
"test-renderer": "^1.1.0"
8+
}
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"dependencies": {
3+
"@testing-library/react-native": "^13.0.0",
4+
"react": "~19.1.0"
5+
},
6+
"devDependencies": {
7+
"react-test-renderer": "19.1.0"
8+
}
9+
}

0 commit comments

Comments
 (0)