Skip to content

Commit 5c8fd5d

Browse files
rickhanloniigaearon
authored andcommitted
Add ReactDOMClient to ServerIntegrationTestUtils (#28130)
## Overview Adds support for `ReactDOMClient` for `ServerIntegration*` tests. Also converts tests that pass without any other changes. Will follow up with other PRs for more complex cases.
1 parent 9177938 commit 5c8fd5d

12 files changed

+66
-35
lines changed

packages/react-dom/src/__tests__/ReactDOMServerIntegrationCheckbox-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,21 @@ const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegratio
1515
const {disableInputAttributeSyncing} = require('shared/ReactFeatureFlags');
1616

1717
let React;
18-
let ReactDOM;
18+
let ReactDOMClient;
1919
let ReactDOMServer;
2020
let ReactTestUtils;
2121

2222
function initModules() {
2323
// Reset warning cache.
2424
jest.resetModules();
2525
React = require('react');
26-
ReactDOM = require('react-dom');
26+
ReactDOMClient = require('react-dom/client');
2727
ReactDOMServer = require('react-dom/server');
2828
ReactTestUtils = require('react-dom/test-utils');
2929

3030
// Make them available to the helpers.
3131
return {
32-
ReactDOM,
32+
ReactDOMClient,
3333
ReactDOMServer,
3434
ReactTestUtils,
3535
};

packages/react-dom/src/__tests__/ReactDOMServerIntegrationClassContextType-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@
1313
const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils');
1414

1515
let React;
16-
let ReactDOM;
16+
let ReactDOMClient;
1717
let ReactDOMServer;
1818
let ReactTestUtils;
1919

2020
function initModules() {
2121
// Reset warning cache.
2222
jest.resetModules();
2323
React = require('react');
24-
ReactDOM = require('react-dom');
24+
ReactDOMClient = require('react-dom/client');
2525
ReactDOMServer = require('react-dom/server');
2626
ReactTestUtils = require('react-dom/test-utils');
2727

2828
// Make them available to the helpers.
2929
return {
30-
ReactDOM,
30+
ReactDOMClient,
3131
ReactDOMServer,
3232
ReactTestUtils,
3333
};

packages/react-dom/src/__tests__/ReactDOMServerIntegrationFragment-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@
1313
const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils');
1414

1515
let React;
16-
let ReactDOM;
16+
let ReactDOMClient;
1717
let ReactDOMServer;
1818
let ReactTestUtils;
1919

2020
function initModules() {
2121
// Reset warning cache.
2222
jest.resetModules();
2323
React = require('react');
24-
ReactDOM = require('react-dom');
24+
ReactDOMClient = require('react-dom/client');
2525
ReactDOMServer = require('react-dom/server');
2626
ReactTestUtils = require('react-dom/test-utils');
2727

2828
// Make them available to the helpers.
2929
return {
30-
ReactDOM,
30+
ReactDOMClient,
3131
ReactDOMServer,
3232
ReactTestUtils,
3333
};

packages/react-dom/src/__tests__/ReactDOMServerIntegrationInput-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,21 @@ const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegratio
1515
const {disableInputAttributeSyncing} = require('shared/ReactFeatureFlags');
1616

1717
let React;
18-
let ReactDOM;
18+
let ReactDOMClient;
1919
let ReactDOMServer;
2020
let ReactTestUtils;
2121

2222
function initModules() {
2323
// Reset warning cache.
2424
jest.resetModules();
2525
React = require('react');
26-
ReactDOM = require('react-dom');
26+
ReactDOMClient = require('react-dom/client');
2727
ReactDOMServer = require('react-dom/server');
2828
ReactTestUtils = require('react-dom/test-utils');
2929

3030
// Make them available to the helpers.
3131
return {
32-
ReactDOM,
32+
ReactDOMClient,
3333
ReactDOMServer,
3434
ReactTestUtils,
3535
};

packages/react-dom/src/__tests__/ReactDOMServerIntegrationModes-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@
1313
const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils');
1414

1515
let React;
16-
let ReactDOM;
16+
let ReactDOMClient;
1717
let ReactDOMServer;
1818
let ReactTestUtils;
1919

2020
function initModules() {
2121
// Reset warning cache.
2222
jest.resetModules();
2323
React = require('react');
24-
ReactDOM = require('react-dom');
24+
ReactDOMClient = require('react-dom/client');
2525
ReactDOMServer = require('react-dom/server');
2626
ReactTestUtils = require('react-dom/test-utils');
2727

2828
// Make them available to the helpers.
2929
return {
30-
ReactDOM,
30+
ReactDOMClient,
3131
ReactDOMServer,
3232
ReactTestUtils,
3333
};

packages/react-dom/src/__tests__/ReactDOMServerIntegrationRefs-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@
1212
const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils');
1313

1414
let React;
15-
let ReactDOM;
15+
let ReactDOMClient;
1616
let ReactDOMServer;
1717
let ReactTestUtils;
1818

1919
function initModules() {
2020
// Reset warning cache.
2121
jest.resetModules();
2222
React = require('react');
23-
ReactDOM = require('react-dom');
23+
ReactDOMClient = require('react-dom/client');
2424
ReactDOMServer = require('react-dom/server');
2525
ReactTestUtils = require('react-dom/test-utils');
2626

2727
// Make them available to the helpers.
2828
return {
29-
ReactDOM,
29+
ReactDOMClient,
3030
ReactDOMServer,
3131
ReactTestUtils,
3232
};

packages/react-dom/src/__tests__/ReactDOMServerIntegrationSpecialTypes-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils');
1414

1515
let React;
16-
let ReactDOM;
16+
let ReactDOMClient;
1717
let ReactDOMServer;
1818
let ReactTestUtils;
1919
let forwardRef;
@@ -26,7 +26,7 @@ function initModules() {
2626
// Reset warning cache.
2727
jest.resetModules();
2828
React = require('react');
29-
ReactDOM = require('react-dom');
29+
ReactDOMClient = require('react-dom/client');
3030
ReactDOMServer = require('react-dom/server');
3131
ReactTestUtils = require('react-dom/test-utils');
3232
forwardRef = React.forwardRef;
@@ -44,7 +44,7 @@ function initModules() {
4444

4545
// Make them available to the helpers.
4646
return {
47-
ReactDOM,
47+
ReactDOMClient,
4848
ReactDOMServer,
4949
ReactTestUtils,
5050
};

packages/react-dom/src/__tests__/ReactDOMServerIntegrationTextarea-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@
1313
const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils');
1414

1515
let React;
16-
let ReactDOM;
16+
let ReactDOMClient;
1717
let ReactDOMServer;
1818
let ReactTestUtils;
1919

2020
function initModules() {
2121
// Reset warning cache.
2222
jest.resetModules();
2323
React = require('react');
24-
ReactDOM = require('react-dom');
24+
ReactDOMClient = require('react-dom/client');
2525
ReactDOMServer = require('react-dom/server');
2626
ReactTestUtils = require('react-dom/test-utils');
2727

2828
// Make them available to the helpers.
2929
return {
30-
ReactDOM,
30+
ReactDOMClient,
3131
ReactDOMServer,
3232
ReactTestUtils,
3333
};

packages/react-dom/src/__tests__/ReactDOMServerIntegrationUserInteraction-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,21 @@
1212
const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils');
1313

1414
let React;
15-
let ReactDOM;
15+
let ReactDOMClient;
1616
let ReactDOMServer;
1717
let ReactTestUtils;
1818

1919
function initModules() {
2020
// Reset warning cache.
2121
jest.resetModules();
2222
React = require('react');
23-
ReactDOM = require('react-dom');
23+
ReactDOMClient = require('react-dom/client');
2424
ReactDOMServer = require('react-dom/server');
2525
ReactTestUtils = require('react-dom/test-utils');
2626

2727
// Make them available to the helpers.
2828
return {
29-
ReactDOM,
29+
ReactDOMClient,
3030
ReactDOMServer,
3131
ReactTestUtils,
3232
};

packages/react-dom/src/__tests__/ReactDOMserverIntegrationProgress-test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,21 @@
1313
const ReactDOMServerIntegrationUtils = require('./utils/ReactDOMServerIntegrationTestUtils');
1414

1515
let React;
16-
let ReactDOM;
16+
let ReactDOMClient;
1717
let ReactDOMServer;
1818
let ReactTestUtils;
1919

2020
function initModules() {
2121
// Reset warning cache.
2222
jest.resetModules();
2323
React = require('react');
24-
ReactDOM = require('react-dom');
24+
ReactDOMClient = require('react-dom/client');
2525
ReactDOMServer = require('react-dom/server');
2626
ReactTestUtils = require('react-dom/test-utils');
2727

2828
// Make them available to the helpers.
2929
return {
30-
ReactDOM,
30+
ReactDOMClient,
3131
ReactDOMServer,
3232
ReactTestUtils,
3333
};

packages/react-dom/src/__tests__/utils/ReactDOMServerIntegrationTestUtils.js

+22-4
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ const shouldIgnoreConsoleError = require('../../../../../scripts/jest/shouldIgno
1414

1515
module.exports = function (initModules) {
1616
let ReactDOM;
17+
let ReactDOMClient;
1718
let ReactDOMServer;
1819
let act;
1920

2021
function resetModules() {
21-
({ReactDOM, ReactDOMServer} = initModules());
22+
({ReactDOM, ReactDOMClient, ReactDOMServer} = initModules());
2223
act = require('internal-test-utils').act;
2324
}
2425

@@ -51,11 +52,24 @@ module.exports = function (initModules) {
5152
async function asyncReactDOMRender(reactElement, domElement, forceHydrate) {
5253
if (forceHydrate) {
5354
await act(() => {
54-
ReactDOM.hydrate(reactElement, domElement);
55+
if (ReactDOMClient) {
56+
ReactDOMClient.hydrateRoot(domElement, reactElement, {
57+
onRecoverableError: () => {
58+
// TODO: assert on recoverable error count.
59+
},
60+
});
61+
} else {
62+
ReactDOM.hydrate(reactElement, domElement);
63+
}
5564
});
5665
} else {
5766
await act(() => {
58-
ReactDOM.render(reactElement, domElement);
67+
if (ReactDOMClient) {
68+
const root = ReactDOMClient.createRoot(domElement);
69+
root.render(reactElement);
70+
} else {
71+
ReactDOM.render(reactElement, domElement);
72+
}
5973
});
6074
}
6175
}
@@ -80,7 +94,11 @@ module.exports = function (initModules) {
8094
for (let i = 0; i < console.error.mock.calls.length; i++) {
8195
const args = console.error.mock.calls[i];
8296
const [format, ...rest] = args;
83-
if (!shouldIgnoreConsoleError(format, rest)) {
97+
if (
98+
!shouldIgnoreConsoleError(format, rest, {
99+
TODO_ignoreHydrationErrors: true,
100+
})
101+
) {
84102
filteredWarnings.push(args);
85103
}
86104
}

scripts/jest/shouldIgnoreConsoleError.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
'use strict';
22

3-
module.exports = function shouldIgnoreConsoleError(format, args) {
3+
module.exports = function shouldIgnoreConsoleError(
4+
format,
5+
args,
6+
{TODO_ignoreHydrationErrors} = {TODO_ignoreHydrationErrors: false}
7+
) {
48
if (__DEV__) {
59
if (typeof format === 'string') {
610
if (format.indexOf('Error: Uncaught [') === 0) {
@@ -23,6 +27,15 @@ module.exports = function shouldIgnoreConsoleError(format, args) {
2327
// We haven't finished migrating our tests to use createRoot.
2428
return true;
2529
}
30+
if (
31+
TODO_ignoreHydrationErrors &&
32+
format.indexOf(
33+
'An error occurred during hydration. The server HTML was replaced with client content in'
34+
) !== -1
35+
) {
36+
// This also gets logged by onRecoverableError, so we can ignore it.
37+
return true;
38+
}
2639
} else if (
2740
format != null &&
2841
typeof format.message === 'string' &&

0 commit comments

Comments
 (0)