Skip to content

Commit d2163f3

Browse files
SkyZeroZxthePunderWoman
authored andcommitted
test(platform-server): add test for transfer state data in nested defer blocks (#63801)
Add test for transfer state data in nested defer blocks PR Close #63801
1 parent 002699b commit d2163f3

1 file changed

Lines changed: 127 additions & 3 deletions

File tree

packages/platform-server/test/incremental_hydration_spec.ts

Lines changed: 127 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)