@@ -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 =
@@ -653,5 +656,88 @@ describe('ReactFlight', () => {
653656 </ > ,
654657 ) ;
655658 } ) ;
659+
660+ // @gate enableServerContext
661+ it ( 'supports useServerContextsForRefetch' , ( ) => {
662+ const ServerContext = React . createServerContext (
663+ 'ServerContext' ,
664+ 'default' ,
665+ ) ;
666+
667+ function Foo ( ) {
668+ return (
669+ < >
670+ < ServerContext . Provider value = "hi this is server outer" >
671+ < ServerContext . Provider value = "hi this is server" >
672+ < Bar value = "" />
673+ </ ServerContext . Provider >
674+ < ServerContext . Provider value = "hi this is server2" >
675+ < Bar value = "2" />
676+ </ ServerContext . Provider >
677+ < Bar value = "outer" />
678+ </ ServerContext . Provider >
679+ < ServerContext . Provider value = "hi this is server outer2" >
680+ < Bar value = "outer2" />
681+ </ ServerContext . Provider >
682+ < Bar value = "default" />
683+ </ >
684+ ) ;
685+ }
686+ const contextsForRefetch = [ ] ;
687+ function ClientBaz ( ) {
688+ const context = React . useContext ( ServerContext ) ;
689+ contextsForRefetch . push (
690+ ReactNoopFlightHooks . useServerContextsForRefetch ( ) ,
691+ ) ;
692+ return < span > { context } </ span > ;
693+ }
694+ function ClientBar ( { value} ) {
695+ return (
696+ < ServerContext . Provider
697+ value = { 'hi this is client' + ( value ? ' ' + value : '' ) } >
698+ < ClientBaz />
699+ </ ServerContext . Provider >
700+ ) ;
701+ }
702+ const Bar = moduleReference ( ClientBar ) ;
703+
704+ const transport = ReactNoopFlightServer . render ( < Foo /> ) ;
705+ act ( ( ) => {
706+ ServerContext . _currentRenderer = null ;
707+ ServerContext . _currentRenderer2 = null ;
708+ ReactNoop . render ( ReactNoopFlightClient . read ( transport ) ) ;
709+ } ) ;
710+ expect ( ReactNoop ) . toMatchRenderedOutput (
711+ < >
712+ < span > hi this is client</ span >
713+ < span > hi this is client 2</ span >
714+ < span > hi this is client outer</ span >
715+ < span > hi this is client outer2</ span >
716+ < span > hi this is client default</ span >
717+ </ > ,
718+ ) ;
719+ const outer = {
720+ parent : null ,
721+ name : 'ServerContext' ,
722+ value : 'hi this is server outer' ,
723+ } ;
724+ expect ( contextsForRefetch [ 0 ] ) . toEqual ( {
725+ parent : outer ,
726+ name : 'ServerContext' ,
727+ value : 'hi this is server' ,
728+ } ) ;
729+ expect ( contextsForRefetch [ 1 ] ) . toEqual ( {
730+ parent : outer ,
731+ name : 'ServerContext' ,
732+ value : 'hi this is server2' ,
733+ } ) ;
734+ expect ( contextsForRefetch [ 2 ] ) . toEqual ( outer ) ;
735+ expect ( contextsForRefetch [ 3 ] ) . toEqual ( {
736+ parent : null ,
737+ name : 'ServerContext' ,
738+ value : 'hi this is server outer2' ,
739+ } ) ;
740+ expect ( contextsForRefetch [ 4 ] ) . toEqual ( null ) ;
741+ } ) ;
656742 } ) ;
657743} ) ;
0 commit comments