Skip to content

Commit 9a1db2d

Browse files
authored
chore: add single versioned implementation of act for DevTools tests (#28186)
- Moving `act` implementation to a single getter-function, which is based on React version we are testing RDT against. - Removing unused mocks for `act`, which were designed for legacy versions of React, validated with running tests against React 16 build.
1 parent 56cd10b commit 9a1db2d

File tree

3 files changed

+32
-40
lines changed

3 files changed

+32
-40
lines changed

packages/react-devtools-shared/src/__tests__/utils.js

+32-8
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,47 @@
77
* @flow
88
*/
99

10+
import semver from 'semver';
11+
1012
import typeof ReactTestRenderer from 'react-test-renderer';
1113

1214
import type {FrontendBridge} from 'react-devtools-shared/src/bridge';
1315
import type Store from 'react-devtools-shared/src/devtools/store';
1416
import type {ProfilingDataFrontend} from 'react-devtools-shared/src/devtools/views/Profiler/types';
1517
import type {ElementType} from 'react-devtools-shared/src/frontend/types';
1618

19+
import {ReactVersion} from '../../../../ReactVersions';
20+
21+
const requestedReactVersion = process.env.REACT_VERSION || ReactVersion;
22+
export function getActDOMImplementation(): () => void | Promise<void> {
23+
// This is for React < 18, where act was distributed in react-dom/test-utils.
24+
if (semver.lt(requestedReactVersion, '18.0.0')) {
25+
const ReactDOMTestUtils = require('react-dom/test-utils');
26+
return ReactDOMTestUtils.act;
27+
}
28+
29+
const React = require('react');
30+
// This is for React 18, where act was distributed in react as unstable.
31+
if (React.unstable_act) {
32+
return React.unstable_act;
33+
}
34+
35+
// This is for React > 18, where act is marked as stable.
36+
if (React.act) {
37+
return React.act;
38+
}
39+
40+
throw new Error("Couldn't find any available act implementation");
41+
}
42+
1743
export function act(
1844
callback: Function,
1945
recursivelyFlush: boolean = true,
2046
): void {
47+
// act from react-test-renderer has some side effects on React DevTools
48+
// it injects the renderer for DevTools, see ReactTestRenderer.js
2149
const {act: actTestRenderer} = require('react-test-renderer');
22-
// Use `require('react-dom/test-utils').act` as a fallback for React 17, which can be used in integration tests for React DevTools.
23-
const actDOM =
24-
require('react').act ||
25-
require('react').unstable_act ||
26-
require('react-dom/test-utils').act;
50+
const actDOM = getActDOMImplementation();
2751

2852
actDOM(() => {
2953
actTestRenderer(() => {
@@ -47,10 +71,10 @@ export async function actAsync(
4771
cb: () => *,
4872
recursivelyFlush: boolean = true,
4973
): Promise<void> {
74+
// act from react-test-renderer has some side effects on React DevTools
75+
// it injects the renderer for DevTools, see ReactTestRenderer.js
5076
const {act: actTestRenderer} = require('react-test-renderer');
51-
// Use `require('react-dom/test-utils').act` as a fallback for React 17, which can be used in integration tests for React DevTools.
52-
const actDOM =
53-
require('react').unstable_act || require('react-dom/test-utils').act;
77+
const actDOM = getActDOMImplementation();
5478

5579
await actDOM(async () => {
5680
await actTestRenderer(async () => {

scripts/jest/devtools/config.build-devtools-regression.js

-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ if (REACT_VERSION) {
3131
'^react-dom/client$'
3232
] = `<rootDir>/build/${NODE_MODULES_DIR}/react-dom`;
3333
}
34-
35-
setupFiles.push(require.resolve('./setupTests.build-devtools-regression'));
3634
}
3735

3836
module.exports = {

scripts/jest/devtools/setupTests.build-devtools-regression.js

-30
This file was deleted.

0 commit comments

Comments
 (0)