@@ -3,6 +3,7 @@ import { h } from 'preact';
3
3
import { Suspense , useId } from 'preact/compat' ;
4
4
import { expect } from 'chai' ;
5
5
import { createSuspender } from '../utils.jsx' ;
6
+ const wait = ( ms ) => new Promise ( ( r ) => setTimeout ( r , ms ) ) ;
6
7
7
8
describe ( 'Async renderToString' , ( ) => {
8
9
it ( 'should render JSX after a suspense boundary' , async ( ) => {
@@ -16,7 +17,30 @@ describe('Async renderToString', () => {
16
17
</ Suspense >
17
18
) ;
18
19
19
- const expected = `<div class="foo">bar</div>` ;
20
+ const expected = `<!-- $s --><div class="foo">bar</div><!-- /$s -->` ;
21
+
22
+ suspended . resolve ( ) ;
23
+
24
+ const rendered = await promise ;
25
+
26
+ expect ( rendered ) . to . equal ( expected ) ;
27
+ } ) ;
28
+
29
+ it ( 'should correctly denote null returns of suspending components' , async ( ) => {
30
+ const { Suspender, suspended } = createSuspender ( ) ;
31
+
32
+ const Analytics = ( ) => null ;
33
+
34
+ const promise = renderToStringAsync (
35
+ < Suspense fallback = { < div > loading...</ div > } >
36
+ < Suspender >
37
+ < Analytics />
38
+ </ Suspender >
39
+ < div class = "foo" > bar</ div >
40
+ </ Suspense >
41
+ ) ;
42
+
43
+ const expected = `<!-- $s --><!-- /$s --><div class="foo">bar</div>` ;
20
44
21
45
suspended . resolve ( ) ;
22
46
@@ -26,10 +50,14 @@ describe('Async renderToString', () => {
26
50
} ) ;
27
51
28
52
it ( 'should render JSX with nested suspended components' , async ( ) => {
29
- const { Suspender : SuspenderOne , suspended : suspendedOne } =
30
- createSuspender ( ) ;
31
- const { Suspender : SuspenderTwo , suspended : suspendedTwo } =
32
- createSuspender ( ) ;
53
+ const {
54
+ Suspender : SuspenderOne ,
55
+ suspended : suspendedOne
56
+ } = createSuspender ( ) ;
57
+ const {
58
+ Suspender : SuspenderTwo ,
59
+ suspended : suspendedTwo
60
+ } = createSuspender ( ) ;
33
61
34
62
const promise = renderToStringAsync (
35
63
< ul >
@@ -45,7 +73,7 @@ describe('Async renderToString', () => {
45
73
</ ul >
46
74
) ;
47
75
48
- const expected = `<ul><li>one</li><li>two</li><li>three</li></ul>` ;
76
+ const expected = `<ul><!-- $s -->< li>one</li><!-- $s -->< li>two</li><!-- /$s -->< li>three</li><!-- /$s -- ></ul>` ;
49
77
50
78
suspendedOne . resolve ( ) ;
51
79
suspendedTwo . resolve ( ) ;
@@ -56,10 +84,14 @@ describe('Async renderToString', () => {
56
84
} ) ;
57
85
58
86
it ( 'should render JSX with nested suspense boundaries' , async ( ) => {
59
- const { Suspender : SuspenderOne , suspended : suspendedOne } =
60
- createSuspender ( ) ;
61
- const { Suspender : SuspenderTwo , suspended : suspendedTwo } =
62
- createSuspender ( ) ;
87
+ const {
88
+ Suspender : SuspenderOne ,
89
+ suspended : suspendedOne
90
+ } = createSuspender ( ) ;
91
+ const {
92
+ Suspender : SuspenderTwo ,
93
+ suspended : suspendedTwo
94
+ } = createSuspender ( ) ;
63
95
64
96
const promise = renderToStringAsync (
65
97
< ul >
@@ -77,23 +109,121 @@ describe('Async renderToString', () => {
77
109
</ ul >
78
110
) ;
79
111
80
- const expected = `<ul><li>one</li><li>two</li><li>three</li></ul>` ;
112
+ const expected = `<ul><!-- $s --><li>one</li><!-- $s --><li>two</li><!-- /$s --><li>three</li><!-- /$s --></ul>` ;
113
+
114
+ suspendedOne . resolve ( ) ;
115
+ suspendedTwo . resolve ( ) ;
116
+
117
+ const rendered = await promise ;
118
+
119
+ expect ( rendered ) . to . equal ( expected ) ;
120
+ } ) ;
121
+
122
+ it ( 'should render JSX with nested suspense boundaries containing multiple suspending components' , async ( ) => {
123
+ const {
124
+ Suspender : SuspenderOne ,
125
+ suspended : suspendedOne
126
+ } = createSuspender ( ) ;
127
+ const {
128
+ Suspender : SuspenderTwo ,
129
+ suspended : suspendedTwo
130
+ } = createSuspender ( ) ;
131
+ const {
132
+ Suspender : SuspenderThree ,
133
+ suspended : suspendedThree
134
+ } = createSuspender ( 'three' ) ;
135
+
136
+ const promise = renderToStringAsync (
137
+ < ul >
138
+ < Suspense fallback = { null } >
139
+ < SuspenderOne >
140
+ < li > one</ li >
141
+ < Suspense fallback = { null } >
142
+ < SuspenderTwo >
143
+ < li > two</ li >
144
+ </ SuspenderTwo >
145
+ < SuspenderThree >
146
+ < li > three</ li >
147
+ </ SuspenderThree >
148
+ </ Suspense >
149
+ < li > four</ li >
150
+ </ SuspenderOne >
151
+ </ Suspense >
152
+ </ ul >
153
+ ) ;
154
+
155
+ const expected = `<ul><!-- $s --><li>one</li><!-- $s --><li>two</li><!-- /$s --><!-- $s --><li>three</li><!-- /$s --><li>four</li><!-- /$s --></ul>` ;
81
156
82
157
suspendedOne . resolve ( ) ;
83
158
suspendedTwo . resolve ( ) ;
159
+ await wait ( 0 ) ;
160
+ suspendedThree . resolve ( ) ;
161
+
162
+ const rendered = await promise ;
163
+
164
+ expect ( rendered ) . to . equal ( expected ) ;
165
+ } ) ;
166
+
167
+ it . only ( 'should render JSX with deeply nested suspense boundaries' , async ( ) => {
168
+ const {
169
+ Suspender : SuspenderOne ,
170
+ suspended : suspendedOne
171
+ } = createSuspender ( ) ;
172
+ const {
173
+ Suspender : SuspenderTwo ,
174
+ suspended : suspendedTwo
175
+ } = createSuspender ( ) ;
176
+ const {
177
+ Suspender : SuspenderThree ,
178
+ suspended : suspendedThree
179
+ } = createSuspender ( ) ;
180
+
181
+ const promise = renderToStringAsync (
182
+ < ul >
183
+ < Suspense fallback = { null } >
184
+ < SuspenderOne >
185
+ < li > one</ li >
186
+ < Suspense fallback = { null } >
187
+ < SuspenderTwo >
188
+ < li > two</ li >
189
+ < Suspense fallback = { null } >
190
+ < SuspenderThree >
191
+ < li > three</ li >
192
+ </ SuspenderThree >
193
+ </ Suspense >
194
+ </ SuspenderTwo >
195
+ </ Suspense >
196
+ < li > four</ li >
197
+ </ SuspenderOne >
198
+ </ Suspense >
199
+ </ ul >
200
+ ) ;
201
+
202
+ const expected = `<ul><!-- $s --><li>one</li><!-- $s --><li>two</li><!-- $s --><li>three</li><!-- /$s --><!-- /$s --><li>four</li><!-- /$s --></ul>` ;
203
+
204
+ suspendedOne . resolve ( ) ;
205
+ suspendedTwo . resolve ( ) ;
206
+ await wait ( 0 ) ;
207
+ suspendedThree . resolve ( ) ;
84
208
85
209
const rendered = await promise ;
86
210
87
211
expect ( rendered ) . to . equal ( expected ) ;
88
212
} ) ;
89
213
90
214
it ( 'should render JSX with multiple suspended direct children within a single suspense boundary' , async ( ) => {
91
- const { Suspender : SuspenderOne , suspended : suspendedOne } =
92
- createSuspender ( ) ;
93
- const { Suspender : SuspenderTwo , suspended : suspendedTwo } =
94
- createSuspender ( ) ;
95
- const { Suspender : SuspenderThree , suspended : suspendedThree } =
96
- createSuspender ( ) ;
215
+ const {
216
+ Suspender : SuspenderOne ,
217
+ suspended : suspendedOne
218
+ } = createSuspender ( ) ;
219
+ const {
220
+ Suspender : SuspenderTwo ,
221
+ suspended : suspendedTwo
222
+ } = createSuspender ( ) ;
223
+ const {
224
+ Suspender : SuspenderThree ,
225
+ suspended : suspendedThree
226
+ } = createSuspender ( ) ;
97
227
98
228
const promise = renderToStringAsync (
99
229
< ul >
@@ -113,7 +243,7 @@ describe('Async renderToString', () => {
113
243
</ ul >
114
244
) ;
115
245
116
- const expected = `<ul><li>one</li><li>two</li><li>three</li></ul>` ;
246
+ const expected = `<ul><!-- $s -->< li>one</li><!-- /$s --><!-- $s -->< li>two</li><!-- /$s --><!-- $s -->< li>three</li><!-- /$s -- ></ul>` ;
117
247
118
248
suspendedOne . resolve ( ) ;
119
249
suspendedTwo . resolve ( ) ;
@@ -173,6 +303,6 @@ describe('Async renderToString', () => {
173
303
174
304
suspended . resolve ( ) ;
175
305
const rendered = await promise ;
176
- expect ( rendered ) . to . equal ( '<p>ok</p>' ) ;
306
+ expect ( rendered ) . to . equal ( '<!-- $s -->< p>ok</p><!-- /$s -- >' ) ;
177
307
} ) ;
178
308
} ) ;
0 commit comments