[test] Use awaited `serverAct` to drive task loop (#36908)
Sebastian "Sebbie" Silbermann committed
Jun 30, 2026 at 16:36 UTC
82043d7de0ec4adb4f4703c298ac9af185862189
1 file changed
+60
-39
packages/react-server-dom-webpack/src/__tests__/ReactFlightDOMEdge-test.js
+60
-39
@@ -1794,23 +1794,33 @@ describe('ReactFlightDOMEdge', () => {
1794
const expectedError = new Error('Bam!');
1795
const errors = [];
1796
1797
- const {prelude} = await ReactServerDOMStaticServer.prerender(
1798
- new ReadableStream({
1799
- async start(controller) {
1800
- await serverAct(() => {
1801
- setTimeout(() => {
1802
- controller.error(expectedError);
1803
- });
1804
- });
1805
- },
1806
- }),
1807
- webpackMap,
1808
- {
1809
- onError(err) {
1810
- errors.push(err);
1811
- },
1797
+ let streamController;
1798
+ const erroringStream = new ReadableStream({
1799
+ start(controller) {
1800
+ streamController = controller;
1801
},
1813
- );
1802
+ });
1803
+
1804
+ const {pendingResult} = await serverAct(async () => {
1805
+ // destructure trick to avoid the act scope from awaiting the returned value
1806
+ return {
1807
+ pendingResult: ReactServerDOMStaticServer.prerender(
1808
+ erroringStream,
1809
+ webpackMap,
1810
+ {
1811
+ onError(err) {
1812
+ errors.push(err);
1813
+ },
1814
+ },
1815
+ ),
1816
+ };
1817
+ });
1818
+
1819
+ await serverAct(() => {
1820
+ streamController.error(expectedError);
1821
+ });
1822
+
1823
+ const {prelude} = await pendingResult;
1824
1825
expect(errors).toEqual([expectedError]);
1826
@@ -2007,25 +2017,33 @@ describe('ReactFlightDOMEdge', () => {
2017
2018
const serverAbortController = new AbortController();
2019
const errors = [];
2010
- const prerenderResult = ReactServerDOMStaticServer.prerender(
2011
- ReactServer.createElement(App, null),
2012
- webpackMap,
2013
- {
2014
- signal: serverAbortController.signal,
2015
- onError(err) {
2016
- errors.push(err);
2017
- },
2018
- },
2019
- );
2020
-
2021
- await new Promise(resolve => {
2022
- setImmediate(() => {
2023
- serverAbortController.abort();
2024
- resolve();
2025
- });
2020
+ const {pendingResult} = await serverAct(async () => {
2021
+ // destructure trick to avoid the act scope from awaiting the returned value
2022
+ return {
2023
+ pendingResult: ReactServerDOMStaticServer.prerender(
2024
+ ReactServer.createElement(App, null),
2025
+ webpackMap,
2026
+ {
2027
+ signal: serverAbortController.signal,
2028
+ onError(err) {
2029
+ errors.push(err);
2030
+ },
2031
+ },
2032
+ ),
2033
+ };
2034
});
2035
2028
- const {prelude} = await prerenderResult;
2036
+ await serverAct(
2037
+ () =>
2038
+ new Promise(resolve => {
2039
+ setImmediate(() => {
2040
+ serverAbortController.abort();
2041
+ resolve();
2042
+ });
2043
+ }),
2044
+ );
2045
+
2046
+ const {prelude} = await pendingResult;
2047
2048
expect(errors).toEqual([]);
2049
@@ -2061,12 +2079,15 @@ describe('ReactFlightDOMEdge', () => {
2079
},
2080
);
2081
2064
- await new Promise(resolve => {
2065
- setImmediate(() => {
2066
- clientAbortController.abort();
2067
- resolve();
2068
- });
2069
- });
2082
+ await serverAct(
2083
+ () =>
2084
+ new Promise(resolve => {
2085
+ setImmediate(() => {
2086
+ clientAbortController.abort();
2087
+ resolve();
2088
+ });
2089
+ }),
2090
+ );
2091
2092
const fizzPrerenderStream = await fizzPrerenderStreamResult;
2093
const prerenderHTML = await readResult(fizzPrerenderStream.prelude);