Unify serverAct helpers (#33327)
This uses the richer `serverAct` helper that we already use in other tests. This avoids using the `Scheduler`. We don't use that package on the server so it doesn't make sense to simulate going through it. Additionally, we really should be getting rid of it on the client too to favor `postTask` polyfills.
Sebastian Markbåge committed
May 21, 2025 at 16:13 UTC
1c43d0aed74de4aae210ba7081b60f944df31954
18 files changed
+94
-255
packages/internal-test-utils/internalAct.js
+45
-31
@@ -138,6 +138,7 @@ export async function act<T>(scope: () => Thenable<T>): Thenable<T> {
138
// those will also fire now, too, which is not ideal. (The public
139
// version of `act` doesn't do this.) For this reason, we should try
140
// to avoid using timers in our internal tests.
141
+ j.runAllTicks();
142
j.runOnlyPendingTimers();
143
// If a committing a fallback triggers another update, it might not
144
// get scheduled until a microtask. So wait one more time.
@@ -194,6 +195,39 @@ export async function act<T>(scope: () => Thenable<T>): Thenable<T> {
195
}
196
}
197
198
+async function waitForTasksAndTimers(error: Error) {
199
+ do {
200
+ // Wait until end of current task/microtask.
201
+ await waitForMicrotasks();
202
+
203
+ // $FlowFixMe[cannot-resolve-name]: Flow doesn't know about global Jest object
204
+ if (jest.isEnvironmentTornDown()) {
205
+ error.message =
206
+ 'The Jest environment was torn down before `act` completed. This ' +
207
+ 'probably means you forgot to `await` an `act` call.';
208
+ throw error;
209
+ }
210
+
211
+ // $FlowFixMe[cannot-resolve-name]: Flow doesn't know about global Jest object
212
+ const j = jest;
213
+ if (j.getTimerCount() > 0) {
214
+ // There's a pending timer. Flush it now. We only do this in order to
215
+ // force Suspense fallbacks to display; the fact that it's a timer
216
+ // is an implementation detail. If there are other timers scheduled,
217
+ // those will also fire now, too, which is not ideal. (The public
218
+ // version of `act` doesn't do this.) For this reason, we should try
219
+ // to avoid using timers in our internal tests.
220
+ j.runAllTicks();
221
+ j.runOnlyPendingTimers();
222
+ // If a committing a fallback triggers another update, it might not
223
+ // get scheduled until a microtask. So wait one more time.
224
+ await waitForMicrotasks();
225
+ } else {
226
+ break;
227
+ }
228
+ } while (true);
229
+}
230
+
231
export async function serverAct<T>(scope: () => Thenable<T>): Thenable<T> {
232
// We require every `act` call to assert console logs
233
// with one of the assertion helpers. Fails if not empty.
@@ -233,37 +267,17 @@ export async function serverAct<T>(scope: () => Thenable<T>): Thenable<T> {
267
}
268
269
try {
236
- const result = await scope();
237
-
238
- do {
239
- // Wait until end of current task/microtask.
240
- await waitForMicrotasks();
241
-
242
- // $FlowFixMe[cannot-resolve-name]: Flow doesn't know about global Jest object
243
- if (jest.isEnvironmentTornDown()) {
244
- error.message =
245
- 'The Jest environment was torn down before `act` completed. This ' +
246
- 'probably means you forgot to `await` an `act` call.';
247
- throw error;
248
- }
249
-
250
- // $FlowFixMe[cannot-resolve-name]: Flow doesn't know about global Jest object
251
- const j = jest;
252
- if (j.getTimerCount() > 0) {
253
- // There's a pending timer. Flush it now. We only do this in order to
254
- // force Suspense fallbacks to display; the fact that it's a timer
255
- // is an implementation detail. If there are other timers scheduled,
256
- // those will also fire now, too, which is not ideal. (The public
257
- // version of `act` doesn't do this.) For this reason, we should try
258
- // to avoid using timers in our internal tests.
259
- j.runOnlyPendingTimers();
260
- // If a committing a fallback triggers another update, it might not
261
- // get scheduled until a microtask. So wait one more time.
262
- await waitForMicrotasks();
263
- } else {
264
- break;
265
- }
266
- } while (true);
270
+ const promise = scope();
271
+ // $FlowFixMe[prop-missing]
272
+ if (promise && typeof promise.catch === 'function') {
273
+ // $FlowFixMe[incompatible-use]
274
+ promise.catch(() => {}); // Handle below
275
+ }
276
+ // See if we need to do some work to unblock the promise first.
277
+ await waitForTasksAndTimers(error);
278
+ const result = await promise;
279
+ // Then wait to flush the result.
280
+ await waitForTasksAndTimers(error);
281
282
if (thrownErrors.length > 0) {
283
// Rethrow any errors logged by the global error handling.
packages/react-dom/src/__tests__/ReactClassComponentPropResolutionFizz-test.js
+3
-14
@@ -22,18 +22,18 @@ let ReactDOMServer;
22
let Scheduler;
23
let assertLog;
24
let container;
25
-let act;
25
+let serverAct;
26
27
describe('ReactClassComponentPropResolutionFizz', () => {
28
beforeEach(() => {
29
jest.resetModules();
30
Scheduler = require('scheduler');
31
- patchMessageChannel(Scheduler);
32
- act = require('internal-test-utils').act;
31
+ patchMessageChannel();
32
33
React = require('react');
34
ReactDOMServer = require('react-dom/server.browser');
35
assertLog = require('internal-test-utils').assertLog;
36
+ serverAct = require('internal-test-utils').serverAct;
37
container = document.createElement('div');
38
document.body.appendChild(container);
39
});
@@ -42,17 +42,6 @@ describe('ReactClassComponentPropResolutionFizz', () => {
42
document.body.removeChild(container);
43
});
44
45
- async function serverAct(callback) {
46
- let maybePromise;
47
- await act(() => {
48
- maybePromise = callback();
49
- if (maybePromise && typeof maybePromise.catch === 'function') {
50
- maybePromise.catch(() => {});
51
- }
52
- });
53
- return maybePromise;
54
- }
55
-
45
async function readIntoContainer(stream) {
46
const reader = stream.getReader();
47
let result = '';
packages/react-dom/src/__tests__/ReactDOMFizzDeferredValue-test.js
+3
-12
@@ -21,6 +21,7 @@ global.ReadableStream =
21
global.TextEncoder = require('util').TextEncoder;
22
23
let act;
24
+let serverAct;
25
let assertLog;
26
let waitForPaint;
27
let container;
@@ -35,8 +36,9 @@ describe('ReactDOMFizzForm', () => {
36
beforeEach(() => {
37
jest.resetModules();
38
Scheduler = require('scheduler');
38
- patchMessageChannel(Scheduler);
39
+ patchMessageChannel();
40
act = require('internal-test-utils').act;
41
+ serverAct = require('internal-test-utils').serverAct;
42
React = require('react');
43
ReactDOMServer = require('react-dom/server.browser');
44
ReactDOMClient = require('react-dom/client');
@@ -52,17 +54,6 @@ describe('ReactDOMFizzForm', () => {
54
document.body.removeChild(container);
55
});
56
55
- async function serverAct(callback) {
56
- let maybePromise;
57
- await act(() => {
58
- maybePromise = callback();
59
- if (maybePromise && typeof maybePromise.catch === 'function') {
60
- maybePromise.catch(() => {});
61
- }
62
- });
63
- return maybePromise;
64
- }
65
-
57
async function readIntoContainer(stream) {
58
const reader = stream.getReader();
59
let result = '';
packages/react-dom/src/__tests__/ReactDOMFizzForm-test.js
+3
-11
@@ -18,6 +18,7 @@ global.ReadableStream =
18
global.TextEncoder = require('util').TextEncoder;
19
20
let act;
21
+let serverAct;
22
let container;
23
let React;
24
let ReactDOMServer;
@@ -25,20 +26,19 @@ let ReactDOMClient;
26
let useFormStatus;
27
let useOptimistic;
28
let useActionState;
28
-let Scheduler;
29
let assertConsoleErrorDev;
30
31
describe('ReactDOMFizzForm', () => {
32
beforeEach(() => {
33
jest.resetModules();
34
- Scheduler = require('scheduler');
35
- patchMessageChannel(Scheduler);
34
+ patchMessageChannel();
35
React = require('react');
36
ReactDOMServer = require('react-dom/server.browser');
37
ReactDOMClient = require('react-dom/client');
38
useFormStatus = require('react-dom').useFormStatus;
39
useOptimistic = require('react').useOptimistic;
40
act = require('internal-test-utils').act;
41
+ serverAct = require('internal-test-utils').serverAct;
42
assertConsoleErrorDev =
43
require('internal-test-utils').assertConsoleErrorDev;
44
container = document.createElement('div');
@@ -55,14 +55,6 @@ describe('ReactDOMFizzForm', () => {
55
document.body.removeChild(container);
56
});
57
58
- async function serverAct(callback) {
59
- let maybePromise;
60
- await act(() => {
61
- maybePromise = callback();
62
- });
63
- return maybePromise;
64
- }
65
-
58
function submit(submitter) {
59
const form = submitter.form || submitter;
60
if (!submitter.form) {
packages/react-dom/src/__tests__/ReactDOMFizzServerBrowser-test.js
+3
-16
@@ -19,33 +19,20 @@ global.TextEncoder = require('util').TextEncoder;
19
let React;
20
let ReactDOMFizzServer;
21
let Suspense;
22
-let Scheduler;
23
-let act;
22
+let serverAct;
23
24
describe('ReactDOMFizzServerBrowser', () => {
25
beforeEach(() => {
26
jest.resetModules();
27
29
- Scheduler = require('scheduler');
30
- patchMessageChannel(Scheduler);
31
- act = require('internal-test-utils').act;
28
+ patchMessageChannel();
29
+ serverAct = require('internal-test-utils').serverAct;
30
31
React = require('react');
32
ReactDOMFizzServer = require('react-dom/server.browser');
33
Suspense = React.Suspense;
34
});
35
38
- async function serverAct(callback) {
39
- let maybePromise;
40
- await act(() => {
41
- maybePromise = callback();
42
- if (maybePromise && typeof maybePromise.catch === 'function') {
43
- maybePromise.catch(() => {});
44
- }
45
- });
46
- return maybePromise;
47
- }
48
-
36
const theError = new Error('This is an error');
37
function Throw() {
38
throw theError;
packages/react-dom/src/__tests__/ReactDOMFizzStaticBrowser-test.js
+3
-16
@@ -31,8 +31,7 @@ let ReactDOMFizzStatic;
31
let Suspense;
32
let SuspenseList;
33
let container;
34
-let Scheduler;
35
-let act;
34
+let serverAct;
35
36
describe('ReactDOMFizzStaticBrowser', () => {
37
beforeEach(() => {
@@ -42,9 +41,8 @@ describe('ReactDOMFizzStaticBrowser', () => {
41
// We need the mocked version of setTimeout inside the document.
42
window.setTimeout = setTimeout;
43
45
- Scheduler = require('scheduler');
46
- patchMessageChannel(Scheduler);
47
- act = require('internal-test-utils').act;
44
+ patchMessageChannel();
45
+ serverAct = require('internal-test-utils').serverAct;
46
47
React = require('react');
48
ReactDOM = require('react-dom');
@@ -63,17 +61,6 @@ describe('ReactDOMFizzStaticBrowser', () => {
61
document.body.removeChild(container);
62
});
63
66
- async function serverAct(callback) {
67
- let maybePromise;
68
- await act(() => {
69
- maybePromise = callback();
70
- if (maybePromise && typeof maybePromise.catch === 'function') {
71
- maybePromise.catch(() => {});
72
- }
73
- });
74
- return maybePromise;
75
- }
76
-
64
const theError = new Error('This is an error');
65
function Throw() {
66
throw theError;
packages/react-dom/src/__tests__/ReactDOMFizzStaticFloat-test.js
+3
-14
@@ -27,15 +27,15 @@ let ReactDOMFizzServer;
27
let ReactDOMFizzStatic;
28
let Suspense;
29
let container;
30
-let Scheduler;
30
let act;
31
+let serverAct;
32
33
describe('ReactDOMFizzStaticFloat', () => {
34
beforeEach(() => {
35
jest.resetModules();
36
- Scheduler = require('scheduler');
37
- patchMessageChannel(Scheduler);
36
+ patchMessageChannel();
37
act = require('internal-test-utils').act;
38
+ serverAct = require('internal-test-utils').serverAct;
39
40
React = require('react');
41
ReactDOM = require('react-dom');
@@ -52,17 +52,6 @@ describe('ReactDOMFizzStaticFloat', () => {
52
document.body.removeChild(container);
53
});
54
55
- async function serverAct(callback) {
56
- let maybePromise;
57
- await act(() => {
58
- maybePromise = callback();
59
- if (maybePromise && typeof maybePromise.catch === 'function') {
60
- maybePromise.catch(() => {});
61
- }
62
- });
63
- return maybePromise;
64
- }
65
-
55
async function readIntoContainer(stream) {
56
const reader = stream.getReader();
57
let result = '';
packages/react-dom/src/test-utils/FizzTestUtils.js
+4
-1
@@ -167,7 +167,10 @@ function getVisibleChildren(element: Element): React$Node {
167
}
168
props[attributes[i].name] = attributes[i].value;
169
}
170
- props.children = getVisibleChildren(node);
170
+ const nestedChildren = getVisibleChildren(node);
171
+ if (nestedChildren !== undefined) {
172
+ props.children = nestedChildren;
173
+ }
174
children.push(
175
require('react').createElement(node.tagName.toLowerCase(), props),
176
);
packages/react-server-dom-turbopack/src/__tests__/ReactFlightTurbopackDOM-test.js
+3
-16
@@ -18,6 +18,7 @@ global.TextEncoder = require('util').TextEncoder;
18
global.TextDecoder = require('util').TextDecoder;
19
20
let act;
21
+let serverAct;
22
let use;
23
let clientExports;
24
let clientExportsESM;
@@ -28,8 +29,6 @@ let ReactDOMClient;
29
let ReactServerDOMServer;
30
let ReactServerDOMClient;
31
let Suspense;
31
-let ReactServerScheduler;
32
-let reactServerAct;
32
let ErrorBoundary;
33
34
describe('ReactFlightTurbopackDOM', () => {
@@ -39,9 +38,8 @@ describe('ReactFlightTurbopackDOM', () => {
38
// condition
39
jest.resetModules();
40
42
- ReactServerScheduler = require('scheduler');
43
- patchSetImmediate(ReactServerScheduler);
44
- reactServerAct = require('internal-test-utils').act;
41
+ patchSetImmediate();
42
+ serverAct = require('internal-test-utils').serverAct;
43
44
// Simulate the condition resolution
45
jest.mock('react-server-dom-turbopack/server', () =>
@@ -84,17 +82,6 @@ describe('ReactFlightTurbopackDOM', () => {
82
};
83
});
84
87
- async function serverAct(callback) {
88
- let maybePromise;
89
- await reactServerAct(() => {
90
- maybePromise = callback();
91
- if (maybePromise && typeof maybePromise.catch === 'function') {
92
- maybePromise.catch(() => {});
93
- }
94
- });
95
- return maybePromise;
96
- }
97
-
85
function getTestStream() {
86
const writable = new Stream.PassThrough();
87
const readable = new ReadableStream({
packages/react-server-dom-turbopack/src/__tests__/ReactFlightTurbopackDOMBrowser-test.js
+2
-13
@@ -21,7 +21,7 @@ let React;
21
let ReactServerDOMServer;
22
let ReactServerDOMClient;
23
let ReactServerScheduler;
24
-let reactServerAct;
24
+let serverAct;
25
26
describe('ReactFlightTurbopackDOMBrowser', () => {
27
beforeEach(() => {
@@ -29,7 +29,7 @@ describe('ReactFlightTurbopackDOMBrowser', () => {
29
30
ReactServerScheduler = require('scheduler');
31
patchMessageChannel(ReactServerScheduler);
32
- reactServerAct = require('internal-test-utils').act;
32
+ serverAct = require('internal-test-utils').serverAct;
33
34
// Simulate the condition resolution
35
jest.mock('react', () => require('react/react.react-server'));
@@ -46,17 +46,6 @@ describe('ReactFlightTurbopackDOMBrowser', () => {
46
ReactServerDOMClient = require('react-server-dom-turbopack/client');
47
});
48
49
- async function serverAct(callback) {
50
- let maybePromise;
51
- await reactServerAct(() => {
52
- maybePromise = callback();
53
- if (maybePromise && typeof maybePromise.catch === 'function') {
54
- maybePromise.catch(() => {});
55
- }
56
- });
57
- return maybePromise;
58
- }
59
-
49
it('should resolve HTML using W3C streams', async () => {
50
function Text({children}) {
51
return <span>{children}</span>;
packages/react-server-dom-turbopack/src/__tests__/ReactFlightTurbopackDOMNode-test.js
+3
-16
@@ -21,16 +21,14 @@ let ReactServerDOMServer;
21
let ReactServerDOMClient;
22
let Stream;
23
let use;
24
-let ReactServerScheduler;
25
-let reactServerAct;
24
+let serverAct;
25
26
describe('ReactFlightTurbopackDOMNode', () => {
27
beforeEach(() => {
28
jest.resetModules();
29
31
- ReactServerScheduler = require('scheduler');
32
- patchSetImmediate(ReactServerScheduler);
33
- reactServerAct = require('internal-test-utils').act;
30
+ patchSetImmediate();
31
+ serverAct = require('internal-test-utils').serverAct;
32
33
// Simulate the condition resolution
34
jest.mock('react', () => require('react/react.react-server'));
@@ -59,17 +57,6 @@ describe('ReactFlightTurbopackDOMNode', () => {
57
use = React.use;
58
});
59
62
- async function serverAct(callback) {
63
- let maybePromise;
64
- await reactServerAct(() => {
65
- maybePromise = callback();
66
- if (maybePromise && typeof maybePromise.catch === 'function') {
67
- maybePromise.catch(() => {});
68
- }
69
- });
70
- return maybePromise;
71
- }
72
-
60
function readResult(stream) {
61
return new Promise((resolve, reject) => {
62
let buffer = '';
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOM-test.js
+3
-16
@@ -19,6 +19,7 @@ global.TextEncoder = require('util').TextEncoder;
19
global.TextDecoder = require('util').TextDecoder;
20
21
let act;
22
+let serverAct;
23
let use;
24
let clientExports;
25
let clientExportsESM;
@@ -37,8 +38,6 @@ let ReactDOMStaticServer;
38
let Suspense;
39
let ErrorBoundary;
40
let JSDOM;
40
-let ReactServerScheduler;
41
-let reactServerAct;
41
let assertConsoleErrorDev;
42
43
describe('ReactFlightDOM', () => {
@@ -50,9 +49,8 @@ describe('ReactFlightDOM', () => {
49
50
JSDOM = require('jsdom').JSDOM;
51
53
- ReactServerScheduler = require('scheduler');
54
- patchSetImmediate(ReactServerScheduler);
55
- reactServerAct = require('internal-test-utils').act;
52
+ patchSetImmediate();
53
+ serverAct = require('internal-test-utils').serverAct;
54
55
// Simulate the condition resolution
56
jest.mock('react', () => require('react/react.react-server'));
@@ -111,17 +109,6 @@ describe('ReactFlightDOM', () => {
109
};
110
});
111
114
- async function serverAct(callback) {
115
- let maybePromise;
116
- await reactServerAct(() => {
117
- maybePromise = callback();
118
- if (maybePromise && typeof maybePromise.catch === 'function') {
119
- maybePromise.catch(() => {});
120
- }
121
- });
122
- return maybePromise;
123
- }
124
-
112
async function readInto(
113
container: Document | HTMLElement,
114
stream: ReadableStream,
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMBrowser-test.js
+3
-16
@@ -24,6 +24,7 @@ let serverExports;
24
let webpackMap;
25
let webpackServerMap;
26
let act;
27
+let serverAct;
28
let React;
29
let ReactDOM;
30
let ReactDOMClient;
@@ -35,9 +36,7 @@ let Suspense;
36
let use;
37
let ReactServer;
38
let ReactServerDOM;
38
-let Scheduler;
39
let ReactServerScheduler;
40
-let reactServerAct;
40
let assertConsoleErrorDev;
41
42
describe('ReactFlightDOMBrowser', () => {
@@ -46,7 +45,7 @@ describe('ReactFlightDOMBrowser', () => {
45
46
ReactServerScheduler = require('scheduler');
47
patchMessageChannel(ReactServerScheduler);
49
- reactServerAct = require('internal-test-utils').act;
48
+ serverAct = require('internal-test-utils').serverAct;
49
50
// Simulate the condition resolution
51
@@ -73,8 +72,7 @@ describe('ReactFlightDOMBrowser', () => {
72
__unmockReact();
73
jest.resetModules();
74
76
- Scheduler = require('scheduler');
77
- patchMessageChannel(Scheduler);
75
+ patchMessageChannel();
76
77
({act, assertConsoleErrorDev} = require('internal-test-utils'));
78
React = require('react');
@@ -86,17 +84,6 @@ describe('ReactFlightDOMBrowser', () => {
84
use = React.use;
85
});
86
89
- async function serverAct(callback) {
90
- let maybePromise;
91
- await reactServerAct(() => {
92
- maybePromise = callback();
93
- if (maybePromise && typeof maybePromise.catch === 'function') {
94
- maybePromise.catch(() => {});
95
- }
96
- });
97
- return maybePromise;
98
- }
99
-
87
function makeDelayedText(Model) {
88
let error, _resolve, _reject;
89
let promise = new Promise((resolve, reject) => {
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js
+2
-13
@@ -36,7 +36,7 @@ let ReactServerDOMServer;
36
let ReactServerDOMStaticServer;
37
let ReactServerDOMClient;
38
let use;
39
-let reactServerAct;
39
+let serverAct;
40
let assertConsoleErrorDev;
41
42
function normalizeCodeLocInfo(str) {
@@ -66,7 +66,7 @@ describe('ReactFlightDOMEdge', () => {
66
67
jest.resetModules();
68
69
- reactServerAct = require('internal-test-utils').serverAct;
69
+ serverAct = require('internal-test-utils').serverAct;
70
assertConsoleErrorDev =
71
require('internal-test-utils').assertConsoleErrorDev;
72
@@ -106,17 +106,6 @@ describe('ReactFlightDOMEdge', () => {
106
use = React.use;
107
});
108
109
- async function serverAct(callback) {
110
- let maybePromise;
111
- await reactServerAct(() => {
112
- maybePromise = callback();
113
- if (maybePromise && typeof maybePromise.catch === 'function') {
114
- maybePromise.catch(() => {});
115
- }
116
- });
117
- return maybePromise;
118
- }
119
-
109
function passThrough(stream) {
110
// Simulate more realistic network by splitting up and rejoining some chunks.
111
// This lets us test that we don't accidentally rely on particular bounds of the chunks.
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMNode-test.js
+3
-16
@@ -26,8 +26,7 @@ let ReactServerDOMStaticServer;
26
let ReactServerDOMClient;
27
let Stream;
28
let use;
29
-let ReactServerScheduler;
30
-let reactServerAct;
29
+let serverAct;
30
31
// We test pass-through without encoding strings but it should work without it too.
32
const streamOptions = {
@@ -38,9 +37,8 @@ describe('ReactFlightDOMNode', () => {
37
beforeEach(() => {
38
jest.resetModules();
39
41
- ReactServerScheduler = require('scheduler');
42
- patchSetImmediate(ReactServerScheduler);
43
- reactServerAct = require('internal-test-utils').act;
40
+ patchSetImmediate();
41
+ serverAct = require('internal-test-utils').serverAct;
42
43
// Simulate the condition resolution
44
jest.mock('react', () => require('react/react.react-server'));
@@ -76,17 +74,6 @@ describe('ReactFlightDOMNode', () => {
74
use = React.use;
75
});
76
79
- async function serverAct(callback) {
80
- let maybePromise;
81
- await reactServerAct(() => {
82
- maybePromise = callback();
83
- if (maybePromise && typeof maybePromise.catch === 'function') {
84
- maybePromise.catch(() => {});
85
- }
86
- });
87
- return maybePromise;
88
- }
89
-
77
function readResult(stream) {
78
return new Promise((resolve, reject) => {
79
let buffer = '';
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMReply-test.js
+2
-13
@@ -23,7 +23,7 @@ let React;
23
let ReactServerDOMServer;
24
let ReactServerDOMClient;
25
let ReactServerScheduler;
26
-let reactServerAct;
26
+let serverAct;
27
28
describe('ReactFlightDOMReply', () => {
29
beforeEach(() => {
@@ -31,7 +31,7 @@ describe('ReactFlightDOMReply', () => {
31
32
ReactServerScheduler = require('scheduler');
33
patchMessageChannel(ReactServerScheduler);
34
- reactServerAct = require('internal-test-utils').act;
34
+ serverAct = require('internal-test-utils').serverAct;
35
36
// Simulate the condition resolution
37
jest.mock('react', () => require('react/react.react-server'));
@@ -48,17 +48,6 @@ describe('ReactFlightDOMReply', () => {
48
ReactServerDOMClient = require('react-server-dom-webpack/client');
49
});
50
51
- async function serverAct(callback) {
52
- let maybePromise;
53
- await reactServerAct(() => {
54
- maybePromise = callback();
55
- if (maybePromise && typeof maybePromise.catch === 'function') {
56
- maybePromise.catch(() => {});
57
- }
58
- });
59
- return maybePromise;
60
- }
61
-
51
// This method should exist on File but is not implemented in JSDOM
52
async function arrayBuffer(file) {
53
return new Promise((resolve, reject) => {
scripts/jest/patchMessageChannel.js
+4
-13
@@ -1,6 +1,6 @@
1
'use strict';
2
3
-export function patchMessageChannel(Scheduler) {
3
+export function patchMessageChannel() {
4
global.MessageChannel = class {
5
constructor() {
6
const port1 = {
@@ -11,18 +11,9 @@ export function patchMessageChannel(Scheduler) {
11
12
this.port2 = {
13
postMessage(msg) {
14
- if (Scheduler) {
15
- Scheduler.unstable_scheduleCallback(
16
- Scheduler.unstable_NormalPriority,
17
- () => {
18
- port1.onmessage(msg);
19
- }
20
- );
21
- } else {
22
- throw new Error(
23
- 'MessageChannel patch was used without providing a Scheduler implementation. This is useful for tests that require this class to exist but are not actually utilizing the MessageChannel class. However it appears some test is trying to use this class so you should pass a Scheduler implemenation to the patch method'
24
- );
25
- }
14
+ setTimeout(() => {
15
+ port1.onmessage(msg);
16
+ }, 0);
17
},
18
};
19
}
scripts/jest/patchSetImmediate.js
+2
-8
@@ -1,13 +1,7 @@
1
'use strict';
2
3
-export function patchSetImmediate(Scheduler) {
4
- if (!Scheduler) {
5
- throw new Error(
6
- 'setImmediate patch was used without providing a Scheduler implementation. If you are patching setImmediate you must provide a Scheduler.'
7
- );
8
- }
9
-
3
+export function patchSetImmediate() {
4
global.setImmediate = cb => {
11
- Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, cb);
5
+ setTimeout(cb, 0);
6
};
7
}