@@ -6,6 +6,7 @@ import { describe, test, expect, beforeAll, afterEach } from 'vitest'
6
6
import { MockFetch } from '../test/mock_fetch.js'
7
7
8
8
import { getStore } from './main.js'
9
+ import type { ListResult } from './store.js'
9
10
10
11
beforeAll ( async ( ) => {
11
12
if ( semver . lt ( nodeVersion , '18.0.0' ) ) {
@@ -171,7 +172,7 @@ describe('list', () => {
171
172
next_cursor : 'cursor_2' ,
172
173
} ) ,
173
174
) ,
174
- url : `https://api.netlify.com/api/v1/sites/${ siteID } /blobs?cursor=cursor_1& directories=true&context=${ storeName } ` ,
175
+ url : `https://api.netlify.com/api/v1/sites/${ siteID } /blobs?directories=true&cursor=cursor_1 &context=${ storeName } ` ,
175
176
} )
176
177
. get ( {
177
178
headers : { authorization : `Bearer ${ apiToken } ` } ,
@@ -188,7 +189,7 @@ describe('list', () => {
188
189
directories : [ 'dir3' ] ,
189
190
} ) ,
190
191
) ,
191
- url : `https://api.netlify.com/api/v1/sites/${ siteID } /blobs?cursor=cursor_2& directories=true&context=${ storeName } ` ,
192
+ url : `https://api.netlify.com/api/v1/sites/${ siteID } /blobs?directories=true&cursor=cursor_2 &context=${ storeName } ` ,
192
193
} )
193
194
. get ( {
194
195
headers : { authorization : `Bearer ${ apiToken } ` } ,
@@ -279,30 +280,47 @@ describe('list', () => {
279
280
expect ( mockStore . fulfilled ) . toBeTruthy ( )
280
281
} )
281
282
282
- test ( 'Paginates manually with `cursor` if `paginate: false`' , async ( ) => {
283
- const mockStore = new MockFetch ( ) . get ( {
284
- headers : { authorization : `Bearer ${ apiToken } ` } ,
285
- response : new Response (
286
- JSON . stringify ( {
287
- blobs : [
288
- {
289
- etag : 'etag3' ,
290
- key : 'key3' ,
291
- size : 3 ,
292
- last_modified : '2023-07-18T12:59:06Z' ,
293
- } ,
294
- {
295
- etag : 'etag4' ,
296
- key : 'key4' ,
297
- size : 4 ,
298
- last_modified : '2023-07-18T12:59:06Z' ,
299
- } ,
300
- ] ,
301
- next_cursor : 'cursor_2' ,
302
- } ) ,
303
- ) ,
304
- url : `https://api.netlify.com/api/v1/sites/${ siteID } /blobs?cursor=cursor_1&context=${ storeName } ` ,
305
- } )
283
+ test ( 'Returns an `AsyncIterator` if `paginate: true`' , async ( ) => {
284
+ const mockStore = new MockFetch ( )
285
+ . get ( {
286
+ headers : { authorization : `Bearer ${ apiToken } ` } ,
287
+ response : new Response (
288
+ JSON . stringify ( {
289
+ blobs : [
290
+ {
291
+ etag : 'etag1' ,
292
+ key : 'key1' ,
293
+ size : 1 ,
294
+ last_modified : '2023-07-18T12:59:06Z' ,
295
+ } ,
296
+ {
297
+ etag : 'etag2' ,
298
+ key : 'key2' ,
299
+ size : 2 ,
300
+ last_modified : '2023-07-18T12:59:06Z' ,
301
+ } ,
302
+ ] ,
303
+ next_cursor : 'cursor_2' ,
304
+ } ) ,
305
+ ) ,
306
+ url : `https://api.netlify.com/api/v1/sites/${ siteID } /blobs?context=${ storeName } ` ,
307
+ } )
308
+ . get ( {
309
+ headers : { authorization : `Bearer ${ apiToken } ` } ,
310
+ response : new Response (
311
+ JSON . stringify ( {
312
+ blobs : [
313
+ {
314
+ etag : 'etag3' ,
315
+ key : 'key3' ,
316
+ size : 3 ,
317
+ last_modified : '2023-07-18T12:59:06Z' ,
318
+ } ,
319
+ ] ,
320
+ } ) ,
321
+ ) ,
322
+ url : `https://api.netlify.com/api/v1/sites/${ siteID } /blobs?cursor=cursor_2&context=${ storeName } ` ,
323
+ } )
306
324
307
325
globalThis . fetch = mockStore . fetch
308
326
@@ -311,15 +329,20 @@ describe('list', () => {
311
329
token : apiToken ,
312
330
siteID,
313
331
} )
332
+ const result : ListResult = {
333
+ blobs : [ ] ,
334
+ directories : [ ] ,
335
+ }
314
336
315
- const { blobs } = await store . list ( {
316
- cursor : 'cursor_1' ,
317
- paginate : false ,
318
- } )
337
+ for await ( const entry of store . list ( { paginate : true } ) ) {
338
+ result . blobs . push ( ... entry . blobs )
339
+ result . directories . push ( ... entry . directories )
340
+ }
319
341
320
- expect ( blobs ) . toEqual ( [
342
+ expect ( result . blobs ) . toEqual ( [
343
+ { etag : 'etag1' , key : 'key1' } ,
344
+ { etag : 'etag2' , key : 'key2' } ,
321
345
{ etag : 'etag3' , key : 'key3' } ,
322
- { etag : 'etag4' , key : 'key4' } ,
323
346
] )
324
347
expect ( mockStore . fulfilled ) . toBeTruthy ( )
325
348
} )
@@ -346,7 +369,7 @@ describe('list', () => {
346
369
last_modified : '2023-07-18T12:59:06Z' ,
347
370
} ,
348
371
] ,
349
- directories : [ 'dir1' ] ,
372
+ directories : [ ] ,
350
373
next_cursor : 'cursor_1' ,
351
374
} ) ,
352
375
) ,
@@ -370,7 +393,7 @@ describe('list', () => {
370
393
last_modified : '2023-07-18T12:59:06Z' ,
371
394
} ,
372
395
] ,
373
- directories : [ 'dir2' ] ,
396
+ directories : [ ] ,
374
397
next_cursor : 'cursor_2' ,
375
398
} ) ,
376
399
) ,
@@ -388,7 +411,7 @@ describe('list', () => {
388
411
last_modified : '2023-07-18T12:59:06Z' ,
389
412
} ,
390
413
] ,
391
- directories : [ 'dir3' ] ,
414
+ directories : [ ] ,
392
415
} ) ,
393
416
) ,
394
417
url : `${ edgeURL } /${ siteID } /${ storeName } ?cursor=cursor_2` ,
@@ -430,15 +453,12 @@ describe('list', () => {
430
453
{ etag : 'etag5' , key : 'key5' } ,
431
454
] )
432
455
433
- // @ts -expect-error `directories` is not part of the return type
434
- expect ( root . directories ) . toBe ( undefined )
456
+ expect ( root . directories ) . toEqual ( [ ] )
435
457
436
458
const directory = await store . list ( { prefix : 'dir2/' } )
437
459
438
460
expect ( directory . blobs ) . toEqual ( [ { etag : 'etag6' , key : 'key6' } ] )
439
-
440
- // @ts -expect-error `directories` is not part of the return type
441
- expect ( directory . directories ) . toBe ( undefined )
461
+ expect ( directory . directories ) . toEqual ( [ ] )
442
462
443
463
expect ( mockStore . fulfilled ) . toBeTruthy ( )
444
464
} )
@@ -491,7 +511,7 @@ describe('list', () => {
491
511
next_cursor : 'cursor_2' ,
492
512
} ) ,
493
513
) ,
494
- url : `${ edgeURL } /${ siteID } /${ storeName } ?cursor=cursor_1& directories=true` ,
514
+ url : `${ edgeURL } /${ siteID } /${ storeName } ?directories=true&cursor=cursor_1 ` ,
495
515
} )
496
516
. get ( {
497
517
headers : { authorization : `Bearer ${ edgeToken } ` } ,
@@ -508,7 +528,7 @@ describe('list', () => {
508
528
directories : [ 'dir3' ] ,
509
529
} ) ,
510
530
) ,
511
- url : `${ edgeURL } /${ siteID } /${ storeName } ?cursor=cursor_2& directories=true` ,
531
+ url : `${ edgeURL } /${ siteID } /${ storeName } ?directories=true&cursor=cursor_2 ` ,
512
532
} )
513
533
. get ( {
514
534
headers : { authorization : `Bearer ${ edgeToken } ` } ,
@@ -601,30 +621,70 @@ describe('list', () => {
601
621
expect ( mockStore . fulfilled ) . toBeTruthy ( )
602
622
} )
603
623
604
- test ( 'Paginates manually with `cursor` if `paginate: false`' , async ( ) => {
605
- const mockStore = new MockFetch ( ) . get ( {
606
- headers : { authorization : `Bearer ${ edgeToken } ` } ,
607
- response : new Response (
608
- JSON . stringify ( {
609
- blobs : [
610
- {
611
- etag : 'etag3' ,
612
- key : 'key3' ,
613
- size : 3 ,
614
- last_modified : '2023-07-18T12:59:06Z' ,
615
- } ,
616
- {
617
- etag : 'etag4' ,
618
- key : 'key4' ,
619
- size : 4 ,
620
- last_modified : '2023-07-18T12:59:06Z' ,
621
- } ,
622
- ] ,
623
- next_cursor : 'cursor_2' ,
624
- } ) ,
625
- ) ,
626
- url : `${ edgeURL } /${ siteID } /${ storeName } ?cursor=cursor_1` ,
627
- } )
624
+ test ( 'Returns an `AsyncIterator` if `paginate: true`' , async ( ) => {
625
+ const mockStore = new MockFetch ( )
626
+ . get ( {
627
+ headers : { authorization : `Bearer ${ edgeToken } ` } ,
628
+ response : new Response (
629
+ JSON . stringify ( {
630
+ blobs : [
631
+ {
632
+ etag : 'etag1' ,
633
+ key : 'key1' ,
634
+ size : 1 ,
635
+ last_modified : '2023-07-18T12:59:06Z' ,
636
+ } ,
637
+ {
638
+ etag : 'etag2' ,
639
+ key : 'key2' ,
640
+ size : 2 ,
641
+ last_modified : '2023-07-18T12:59:06Z' ,
642
+ } ,
643
+ ] ,
644
+ next_cursor : 'cursor_2' ,
645
+ } ) ,
646
+ ) ,
647
+ url : `${ edgeURL } /${ siteID } /${ storeName } ` ,
648
+ } )
649
+ . get ( {
650
+ headers : { authorization : `Bearer ${ edgeToken } ` } ,
651
+ response : new Response (
652
+ JSON . stringify ( {
653
+ blobs : [
654
+ {
655
+ etag : 'etag3' ,
656
+ key : 'key3' ,
657
+ size : 3 ,
658
+ last_modified : '2023-07-18T12:59:06Z' ,
659
+ } ,
660
+ {
661
+ etag : 'etag4' ,
662
+ key : 'key4' ,
663
+ size : 4 ,
664
+ last_modified : '2023-07-18T12:59:06Z' ,
665
+ } ,
666
+ ] ,
667
+ next_cursor : 'cursor_3' ,
668
+ } ) ,
669
+ ) ,
670
+ url : `${ edgeURL } /${ siteID } /${ storeName } ?cursor=cursor_2` ,
671
+ } )
672
+ . get ( {
673
+ headers : { authorization : `Bearer ${ edgeToken } ` } ,
674
+ response : new Response (
675
+ JSON . stringify ( {
676
+ blobs : [
677
+ {
678
+ etag : 'etag5' ,
679
+ key : 'key5' ,
680
+ size : 5 ,
681
+ last_modified : '2023-07-18T12:59:06Z' ,
682
+ } ,
683
+ ] ,
684
+ } ) ,
685
+ ) ,
686
+ url : `${ edgeURL } /${ siteID } /${ storeName } ?cursor=cursor_3` ,
687
+ } )
628
688
629
689
globalThis . fetch = mockStore . fetch
630
690
@@ -634,16 +694,24 @@ describe('list', () => {
634
694
token : edgeToken ,
635
695
siteID,
636
696
} )
697
+ const result : ListResult = {
698
+ blobs : [ ] ,
699
+ directories : [ ] ,
700
+ }
637
701
638
- const { blobs } = await store . list ( {
639
- cursor : 'cursor_1' ,
640
- paginate : false ,
641
- } )
702
+ for await ( const entry of store . list ( { paginate : true } ) ) {
703
+ result . blobs . push ( ... entry . blobs )
704
+ result . directories . push ( ... entry . directories )
705
+ }
642
706
643
- expect ( blobs ) . toEqual ( [
707
+ expect ( result . blobs ) . toEqual ( [
708
+ { etag : 'etag1' , key : 'key1' } ,
709
+ { etag : 'etag2' , key : 'key2' } ,
644
710
{ etag : 'etag3' , key : 'key3' } ,
645
711
{ etag : 'etag4' , key : 'key4' } ,
712
+ { etag : 'etag5' , key : 'key5' } ,
646
713
] )
714
+ expect ( result . directories ) . toEqual ( [ ] )
647
715
expect ( mockStore . fulfilled ) . toBeTruthy ( )
648
716
} )
649
717
} )
0 commit comments