@@ -301,6 +301,84 @@ describe('ReactDOMFizzServer', () => {
301301 ) ;
302302 } ) ;
303303
304+ // @gate experimental
305+ it ( 'should asynchronously load a lazy component with sibling after' , async ( ) => {
306+ const makeApp = ( ) => {
307+ let resolve ;
308+ const imports = new Promise ( r => {
309+ resolve = ( ) => r ( { default : ( ) => < span id = "async" > async</ span > } ) ;
310+ } ) ;
311+ const Lazy = React . lazy ( ( ) => imports ) ;
312+
313+ // Test passes if you change:
314+ // <span id="after">after</span>
315+ // to:
316+ // <Suspense fallback={null}><span id="after">after</span></Suspense>
317+ const App = ( ) => (
318+ < div >
319+ < Suspense fallback = { < span > Loading...</ span > } >
320+ < Lazy />
321+ < span id = "after" > after</ span >
322+ </ Suspense >
323+ </ div >
324+ ) ;
325+
326+ return [ App , resolve ] ;
327+ } ;
328+
329+ // Server-side
330+ const [ App , resolve ] = makeApp ( ) ;
331+ await act ( async ( ) => {
332+ const { pipe} = ReactDOMFizzServer . renderToPipeableStream ( < App /> ) ;
333+ pipe ( writable ) ;
334+ } ) ;
335+ expect ( getVisibleChildren ( container ) ) . toEqual (
336+ < div >
337+ < span > Loading...</ span >
338+ </ div > ,
339+ ) ;
340+ await act ( async ( ) => {
341+ resolve ( ) ;
342+ } ) ;
343+ expect ( getVisibleChildren ( container ) ) . toEqual (
344+ < div >
345+ < span id = "async" > async</ span >
346+ < span id = "after" > after</ span >
347+ </ div > ,
348+ ) ;
349+
350+ // Client-side
351+ const [ HydrateApp , hydrateResolve ] = makeApp ( ) ;
352+ await act ( async ( ) => {
353+ ReactDOM . hydrateRoot ( container , < HydrateApp /> ) ;
354+ // Throws after flushAll:
355+ // Warning: Prop `id` did not match. Server: "async" Client: "after"
356+ // at span
357+ // at Suspense
358+ // at div
359+ // at App
360+ Scheduler . unstable_flushAll ( ) ;
361+ } ) ;
362+
363+ // nb: Honestly not really sure whether this should expect "loading..." or "async"
364+ expect ( getVisibleChildren ( container ) ) . toEqual (
365+ < div >
366+ < span id = "async" > async</ span >
367+ < span id = "after" > after</ span >
368+ </ div > ,
369+ ) ;
370+
371+ await act ( async ( ) => {
372+ hydrateResolve ( ) ;
373+ } ) ;
374+ expect ( getVisibleChildren ( container ) ) . toEqual (
375+ < div >
376+ < span id = "async" > async</ span >
377+ < span id = "after" > after</ span >
378+ </ div > ,
379+ ) ;
380+ } ) ;
381+
304382 // @gate experimental
305383 it ( 'should support nonce scripts' , async ( ) => {
306384 CSPnonce = 'R4nd0m' ;
0 commit comments