@samitouri / QOS-React / commits / 1c43d0aed7

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 }