@@ -490,6 +490,75 @@ def test_list_objects_versions_with_prefix(
490
490
resp_dict ["ListVersionsResult" ].pop ("@xmlns" , None )
491
491
snapshot .match ("list-objects-versions-no-encoding" , resp_dict )
492
492
493
+ @markers .aws .validated
494
+ def test_list_objects_versions_with_prefix_only_and_pagination (
495
+ self , s3_bucket , snapshot , aws_client , aws_http_client_factory
496
+ ):
497
+ snapshot .add_transformer (snapshot .transform .s3_api ())
498
+ aws_client .s3 .put_bucket_versioning (
499
+ Bucket = s3_bucket ,
500
+ VersioningConfiguration = {"Status" : "Enabled" },
501
+ )
502
+
503
+ for _ in range (10 ):
504
+ aws_client .s3 .put_object (Bucket = s3_bucket , Key = "prefixed_key" )
505
+
506
+ aws_client .s3 .put_object (Bucket = s3_bucket , Key = "non_prefixed_key" )
507
+
508
+ prefixed_full = aws_client .s3 .list_object_versions (Bucket = s3_bucket , Prefix = "prefix" )
509
+ snapshot .match ("list-object-version-prefix-full" , prefixed_full )
510
+
511
+ full_response = aws_client .s3 .list_object_versions (Bucket = s3_bucket )
512
+ assert len (full_response ["Versions" ]) == 11
513
+
514
+ page_1_response = aws_client .s3 .list_object_versions (
515
+ Bucket = s3_bucket , Prefix = "prefix" , MaxKeys = 5
516
+ )
517
+ snapshot .match ("list-object-version-prefix-page-1" , page_1_response )
518
+ next_version_id_marker = page_1_response ["NextVersionIdMarker" ]
519
+
520
+ page_2_key_marker_only = aws_client .s3 .list_object_versions (
521
+ Bucket = s3_bucket ,
522
+ Prefix = "prefix" ,
523
+ MaxKeys = 7 ,
524
+ KeyMarker = page_1_response ["NextKeyMarker" ],
525
+ )
526
+ snapshot .match ("list-object-version-prefix-key-marker-only" , page_2_key_marker_only )
527
+
528
+ page_2_response = aws_client .s3 .list_object_versions (
529
+ Bucket = s3_bucket ,
530
+ Prefix = "prefix" ,
531
+ MaxKeys = 10 ,
532
+ KeyMarker = page_1_response ["NextKeyMarker" ],
533
+ VersionIdMarker = page_1_response ["NextVersionIdMarker" ],
534
+ )
535
+ snapshot .match ("list-object-version-prefix-page-2" , page_2_response )
536
+
537
+ delete_version_id_marker = aws_client .s3 .delete_objects (
538
+ Bucket = s3_bucket ,
539
+ Delete = {
540
+ "Objects" : [
541
+ {"Key" : version ["Key" ], "VersionId" : version ["VersionId" ]}
542
+ for version in page_1_response ["Versions" ]
543
+ ],
544
+ },
545
+ )
546
+ # result is unordered in AWS, pretty hard to snapshot and tested in other places anyway
547
+ assert len (delete_version_id_marker ["Deleted" ]) == 5
548
+ assert any (
549
+ version ["VersionId" ] == next_version_id_marker
550
+ for version in delete_version_id_marker ["Deleted" ]
551
+ )
552
+
553
+ page_2_response = aws_client .s3 .list_object_versions (
554
+ Bucket = s3_bucket ,
555
+ Prefix = "prefix" ,
556
+ MaxKeys = 10 ,
557
+ KeyMarker = page_1_response ["NextKeyMarker" ],
558
+ VersionIdMarker = next_version_id_marker ,
559
+ )
560
+ snapshot .match ("list-object-version-prefix-page-2-after-delete" , page_2_response )
561
+
493
562
@markers .aws .validated
494
563
def test_s3_list_object_versions_timestamp_precision (
495
564
self , s3_bucket , aws_client , aws_http_client_factory
0 commit comments