@@ -15,6 +15,7 @@ let React;
1515let ReactNoop ;
1616let ReactNoopFlightServer ;
1717let ReactNoopFlightClient ;
18+ let ReactNoopFlightHooks ;
1819let ErrorBoundary ;
1920let NoErrorExpected ;
2021let Scheduler ;
@@ -28,6 +29,8 @@ describe('ReactFlight', () => {
2829 ReactNoop = require ( 'react-noop-renderer' ) ;
2930 ReactNoopFlightServer = require ( 'react-noop-renderer/flight-server' ) ;
3031 ReactNoopFlightClient = require ( 'react-noop-renderer/flight-client' ) ;
32+ ReactNoopFlightHooks = require ( 'react-noop-renderer/flight-hooks' ) ;
33+
3134 act = require ( 'jest-react' ) . act ;
3235 Scheduler = require ( 'scheduler' ) ;
3336 const ReactSharedInternals =
@@ -651,5 +654,88 @@ describe('ReactFlight', () => {
651654 </ > ,
652655 ) ;
653656 } ) ;
657+
658+ // @gate enableServerContext
659+ it ( 'supports useServerContextsForRefetch' , ( ) => {
660+ const ServerContext = React . createServerContext (
661+ 'ServerContext' ,
662+ 'default' ,
663+ ) ;
664+
665+ function Foo ( ) {
666+ return (
667+ < >
668+ < ServerContext . Provider value = "hi this is server outer" >
669+ < ServerContext . Provider value = "hi this is server" >
670+ < Bar value = "" />
671+ </ ServerContext . Provider >
672+ < ServerContext . Provider value = "hi this is server2" >
673+ < Bar value = "2" />
674+ </ ServerContext . Provider >
675+ < Bar value = "outer" />
676+ </ ServerContext . Provider >
677+ < ServerContext . Provider value = "hi this is server outer2" >
678+ < Bar value = "outer2" />
679+ </ ServerContext . Provider >
680+ < Bar value = "default" />
681+ </ >
682+ ) ;
683+ }
684+ const contextsForRefetch = [ ] ;
685+ function ClientBaz ( ) {
686+ const context = React . useContext ( ServerContext ) ;
687+ contextsForRefetch . push (
688+ ReactNoopFlightHooks . useServerContextsForRefetch ( ) ,
689+ ) ;
690+ return < span > { context } </ span > ;
691+ }
692+ function ClientBar ( { value} ) {
693+ return (
694+ < ServerContext . Provider
695+ value = { 'hi this is client' + ( value ? ' ' + value : '' ) } >
696+ < ClientBaz />
697+ </ ServerContext . Provider >
698+ ) ;
699+ }
700+ const Bar = moduleReference ( ClientBar ) ;
701+
702+ const transport = ReactNoopFlightServer . render ( < Foo /> ) ;
703+ act ( ( ) => {
704+ ServerContext . _currentRenderer = null ;
705+ ServerContext . _currentRenderer2 = null ;
706+ ReactNoop . render ( ReactNoopFlightClient . read ( transport ) ) ;
707+ } ) ;
708+ expect ( ReactNoop ) . toMatchRenderedOutput (
709+ < >
710+ < span > hi this is client</ span >
711+ < span > hi this is client 2</ span >
712+ < span > hi this is client outer</ span >
713+ < span > hi this is client outer2</ span >
714+ < span > hi this is client default</ span >
715+ </ > ,
716+ ) ;
717+ const outer = {
718+ parent : null ,
719+ name : 'ServerContext' ,
720+ value : 'hi this is server outer' ,
721+ } ;
722+ expect ( contextsForRefetch [ 0 ] ) . toEqual ( {
723+ parent : outer ,
724+ name : 'ServerContext' ,
725+ value : 'hi this is server' ,
726+ } ) ;
727+ expect ( contextsForRefetch [ 1 ] ) . toEqual ( {
728+ parent : outer ,
729+ name : 'ServerContext' ,
730+ value : 'hi this is server2' ,
731+ } ) ;
732+ expect ( contextsForRefetch [ 2 ] ) . toEqual ( outer ) ;
733+ expect ( contextsForRefetch [ 3 ] ) . toEqual ( {
734+ parent : null ,
735+ name : 'ServerContext' ,
736+ value : 'hi this is server outer2' ,
737+ } ) ;
738+ expect ( contextsForRefetch [ 4 ] ) . toEqual ( null ) ;
739+ } ) ;
654740 } ) ;
655741} ) ;
0 commit comments