@@ -95,6 +95,12 @@ test.describe('Prefetch (default)', () => {
95
95
await page . locator ( '#prefetch-manual' ) . click ( ) ;
96
96
expect ( reqUrls . filter ( ( u ) => u . includes ( '/prefetch-manual' ) ) . length ) . toEqual ( 1 ) ;
97
97
} ) ;
98
+
99
+ test ( 'data-astro-prefetch="load" should prefetch' , async ( { page, astro } ) => {
100
+ await page . goto ( astro . resolveUrl ( '/' ) ) ;
101
+ expect ( reqUrls ) . toContainEqual ( '/prefetch-load' ) ;
102
+ expect ( page . locator ( 'link[rel="prefetch"][href$="/prefetch-load"]' ) ) . toBeDefined ( ) ;
103
+ } ) ;
98
104
} ) ;
99
105
100
106
test . describe ( "Prefetch (prefetchAll: true, defaultStrategy: 'tap')" , ( ) => {
@@ -182,4 +188,99 @@ test.describe("Prefetch (prefetchAll: true, defaultStrategy: 'tap')", () => {
182
188
expect ( reqUrls ) . toContainEqual ( '/prefetch-viewport' ) ;
183
189
expect ( page . locator ( 'link[rel="prefetch"][href$="/prefetch-viewport"]' ) ) . toBeDefined ( ) ;
184
190
} ) ;
191
+
192
+ test ( 'data-astro-prefetch="load" should prefetch' , async ( { page, astro } ) => {
193
+ await page . goto ( astro . resolveUrl ( '/' ) ) ;
194
+ expect ( reqUrls ) . toContainEqual ( '/prefetch-load' ) ;
195
+ expect ( page . locator ( 'link[rel="prefetch"][href$="/prefetch-load"]' ) ) . toBeDefined ( ) ;
196
+ } ) ;
197
+ } ) ;
198
+
199
+ test . describe ( "Prefetch (prefetchAll: true, defaultStrategy: 'load')" , ( ) => {
200
+ let devServer ;
201
+ /** @type {string[] } */
202
+ const reqUrls = [ ] ;
203
+
204
+ test . beforeAll ( async ( { astro } ) => {
205
+ devServer = await astro . startDevServer ( {
206
+ prefetch : {
207
+ prefetchAll : true ,
208
+ defaultStrategy : 'load' ,
209
+ } ,
210
+ } ) ;
211
+ } ) ;
212
+
213
+ test . beforeEach ( async ( { page } ) => {
214
+ page . on ( 'request' , ( req ) => {
215
+ const urlObj = new URL ( req . url ( ) ) ;
216
+ reqUrls . push ( urlObj . pathname + urlObj . search ) ;
217
+ } ) ;
218
+ } ) ;
219
+
220
+ test . afterEach ( ( ) => {
221
+ reqUrls . length = 0 ;
222
+ } ) ;
223
+
224
+ test . afterAll ( async ( ) => {
225
+ await devServer . stop ( ) ;
226
+ } ) ;
227
+
228
+ test ( 'Link without data-astro-prefetch should prefetch' , async ( { page, astro } ) => {
229
+ await page . goto ( astro . resolveUrl ( '/' ) ) ;
230
+ expect ( reqUrls ) . toContainEqual ( '/prefetch-default' ) ;
231
+ expect ( page . locator ( 'link[rel="prefetch"][href$="/prefetch-default"]' ) ) . toBeDefined ( ) ;
232
+ } ) ;
233
+
234
+ test ( 'data-astro-prefetch="false" should not prefetch' , async ( { page, astro } ) => {
235
+ await page . goto ( astro . resolveUrl ( '/' ) ) ;
236
+ expect ( reqUrls ) . not . toContainEqual ( '/prefetch-false' ) ;
237
+ } ) ;
238
+
239
+ test ( 'Link with search param should prefetch' , async ( { page, astro } ) => {
240
+ await page . goto ( astro . resolveUrl ( '/' ) ) ;
241
+ expect ( reqUrls ) . not . toContainEqual ( '/?search-param=true' ) ;
242
+ await Promise . all ( [
243
+ page . waitForEvent ( 'request' ) , // wait prefetch request
244
+ page . locator ( '#prefetch-search-param' ) . hover ( ) ,
245
+ ] ) ;
246
+ expect ( reqUrls ) . toContainEqual ( '/?search-param=true' ) ;
247
+ } ) ;
248
+
249
+ test ( 'data-astro-prefetch="tap" should prefetch on tap' , async ( { page, astro } ) => {
250
+ await page . goto ( astro . resolveUrl ( '/' ) ) ;
251
+ expect ( reqUrls ) . not . toContainEqual ( '/prefetch-tap' ) ;
252
+ await Promise . all ( [
253
+ page . waitForEvent ( 'request' ) , // wait prefetch request
254
+ page . locator ( '#prefetch-tap' ) . click ( ) ,
255
+ ] ) ;
256
+ expect ( reqUrls ) . toContainEqual ( '/prefetch-tap' ) ;
257
+ } ) ;
258
+
259
+ test ( 'data-astro-prefetch="hover" should prefetch on hover' , async ( { page, astro } ) => {
260
+ await page . goto ( astro . resolveUrl ( '/' ) ) ;
261
+ expect ( reqUrls ) . not . toContainEqual ( '/prefetch-hover' ) ;
262
+ await Promise . all ( [
263
+ page . waitForEvent ( 'request' ) , // wait prefetch request
264
+ page . locator ( '#prefetch-hover' ) . hover ( ) ,
265
+ ] ) ;
266
+ expect ( reqUrls ) . toContainEqual ( '/prefetch-hover' ) ;
267
+ } ) ;
268
+
269
+ test ( 'data-astro-prefetch="viewport" should prefetch on viewport' , async ( { page, astro } ) => {
270
+ await page . goto ( astro . resolveUrl ( '/' ) ) ;
271
+ expect ( reqUrls ) . not . toContainEqual ( '/prefetch-viewport' ) ;
272
+ // Scroll down to show the element
273
+ await Promise . all ( [
274
+ page . waitForEvent ( 'request' ) , // wait prefetch request
275
+ page . locator ( '#prefetch-viewport' ) . scrollIntoViewIfNeeded ( ) ,
276
+ ] ) ;
277
+ expect ( reqUrls ) . toContainEqual ( '/prefetch-viewport' ) ;
278
+ expect ( page . locator ( 'link[rel="prefetch"][href$="/prefetch-viewport"]' ) ) . toBeDefined ( ) ;
279
+ } ) ;
280
+
281
+ test ( 'data-astro-prefetch="load" should prefetch' , async ( { page, astro } ) => {
282
+ await page . goto ( astro . resolveUrl ( '/' ) ) ;
283
+ expect ( reqUrls ) . toContainEqual ( '/prefetch-load' ) ;
284
+ expect ( page . locator ( 'link[rel="prefetch"][href$="/prefetch-load"]' ) ) . toBeDefined ( ) ;
285
+ } ) ;
185
286
} ) ;
0 commit comments