@samitouri / QOS-React-1 / commits / 82043d7de0

[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);