@@ -682,10 +682,134 @@ describe('platform-server partial hydration integration', () => {
682682 } ) ;
683683 } ) ;
684684
685- /* TODO: tests to add
685+ describe ( 'transfer state for nested defer blocks' , ( ) => {
686+ it ( 'should have correct transfer state data for 2-level nested defer blocks' , async ( ) => {
687+ @Component ( {
688+ selector : 'app' ,
689+ template : `
690+ @defer (on viewport; hydrate on interaction) {
691+ <div>
692+ Level 1
693+ @defer (on viewport; hydrate on interaction) {
694+ <div>Level 2</div>
695+ } @placeholder {
696+ <span>Level 2 placeholder</span>
697+ }
698+ </div>
699+ } @placeholder {
700+ <span>Level 1 placeholder</span>
701+ }
702+ ` ,
703+ } )
704+ class SimpleComponent { }
705+
706+ const appId = 'custom-app-id' ;
707+ const providers = [ { provide : APP_ID , useValue : appId } ] ;
708+ const hydrationFeatures = ( ) => [ withIncrementalHydration ( ) ] ;
709+
710+ const html = await ssr ( SimpleComponent , { envProviders : providers , hydrationFeatures} ) ;
711+ const ssrContents = getAppContents ( html ) ;
712+
713+ // Check that levels are rendered
714+ expect ( ssrContents ) . toContain ( 'Level 1' ) ;
715+ expect ( ssrContents ) . toContain ( 'Level 2' ) ;
716+
717+ // Check the transfer state data
718+ expect ( ssrContents ) . toContain (
719+ '"__nghDeferData__":{"d0":{"r":1,"s":2},"d1":{"r":1,"s":2,"p":"d0"}}' ,
720+ ) ;
721+ } ) ;
722+
723+ it ( 'should have correct transfer state data for 4-level nested defer blocks' , async ( ) => {
724+ @Component ( {
725+ selector : 'app' ,
726+ template : `
727+ @defer (on viewport; hydrate on interaction) {
728+ <div>
729+ Level 1
730+ @defer (on viewport; hydrate on interaction) {
731+ <div>
732+ Level 2
733+ @defer (on viewport; hydrate on interaction) {
734+ <div>
735+ Level 3
736+ @defer (on viewport; hydrate on interaction) {
737+ <div>Level 4</div>
738+ } @placeholder {
739+ <span>Level 4 placeholder</span>
740+ }
741+ </div>
742+ } @placeholder {
743+ <span>Level 3 placeholder</span>
744+ }
745+ </div>
746+ } @placeholder {
747+ <span>Level 2 placeholder</span>
748+ }
749+ </div>
750+ } @placeholder {
751+ <span>Level 1 placeholder</span>
752+ }
753+ ` ,
754+ } )
755+ class SimpleComponent { }
756+
757+ const appId = 'custom-app-id' ;
758+ const providers = [ { provide : APP_ID , useValue : appId } ] ;
759+ const hydrationFeatures = ( ) => [ withIncrementalHydration ( ) ] ;
760+
761+ const html = await ssr ( SimpleComponent , { envProviders : providers , hydrationFeatures} ) ;
762+ const ssrContents = getAppContents ( html ) ;
763+
764+ // Check that all levels are rendered
765+ expect ( ssrContents ) . toContain ( 'Level 1' ) ;
766+ expect ( ssrContents ) . toContain ( 'Level 2' ) ;
767+ expect ( ssrContents ) . toContain ( 'Level 3' ) ;
768+ expect ( ssrContents ) . toContain ( 'Level 4' ) ;
769+
770+ // Check the transfer state data
771+ expect ( ssrContents ) . toContain (
772+ '"__nghDeferData__":{"d0":{"r":1,"s":2},"d1":{"r":1,"s":2,"p":"d0"},"d2":{"r":1,"s":2,"p":"d1"},"d3":{"r":1,"s":2,"p":"d2"}}' ,
773+ ) ;
774+ } ) ;
775+
776+ it ( 'should have correct transfer state data for nested defer blocks with different triggers' , async ( ) => {
777+ @Component ( {
778+ selector : 'app' ,
779+ template : `
780+ @defer (on viewport; hydrate on interaction) {
781+ <div>
782+ Level 1
783+ @defer (on viewport; hydrate on viewport) {
784+ <div>Level 2</div>
785+ } @placeholder {
786+ <span>Level 2 placeholder</span>
787+ }
788+ </div>
789+ } @placeholder {
790+ <span>Level 1 placeholder</span>
791+ }
792+ ` ,
793+ } )
794+ class SimpleComponent { }
795+
796+ const appId = 'custom-app-id' ;
797+ const providers = [ { provide : APP_ID , useValue : appId } ] ;
798+ const hydrationFeatures = ( ) => [ withIncrementalHydration ( ) ] ;
799+
800+ const html = await ssr ( SimpleComponent , { envProviders : providers , hydrationFeatures} ) ;
801+ const ssrContents = getAppContents ( html ) ;
686802
687- 3. transfer state data is correct for parent / child defer blocks
688- */
803+ // Check that levels are rendered
804+ expect ( ssrContents ) . toContain ( 'Level 1' ) ;
805+ expect ( ssrContents ) . toContain ( 'Level 2' ) ;
806+
807+ // Check the transfer state data with trigger array
808+ expect ( ssrContents ) . toContain (
809+ '"__nghDeferData__":{"d0":{"r":1,"s":2},"d1":{"r":1,"s":2,"t":[2],"p":"d0"}}' ,
810+ ) ;
811+ } ) ;
812+ } ) ;
689813
690814 describe ( 'triggers' , ( ) => {
691815 describe ( 'hydrate on interaction' , ( ) => {
0 commit comments