@@ -783,6 +783,58 @@ def test_copy_object_in_place_with_bucket_encryption():
783
783
assert response ["ServerSideEncryption" ] == "AES256"
784
784
785
785
786
+ @mock_aws
787
+ def test_copy_object_in_place_with_versioning ():
788
+ # If a bucket has versioning enabled, it will allow copy in place
789
+ client = boto3 .client ("s3" , region_name = DEFAULT_REGION_NAME )
790
+ bucket_name = "testbucket"
791
+ client .create_bucket (Bucket = bucket_name )
792
+ key = "source-key"
793
+
794
+ response = client .put_object (
795
+ Body = b"" ,
796
+ Bucket = bucket_name ,
797
+ Key = key ,
798
+ )
799
+
800
+ response = client .put_bucket_versioning (
801
+ Bucket = bucket_name ,
802
+ VersioningConfiguration = {
803
+ "MFADelete" : "Disabled" ,
804
+ "Status" : "Enabled" ,
805
+ },
806
+ )
807
+ assert response ["ResponseMetadata" ]["HTTPStatusCode" ] == 200
808
+
809
+ response = client .put_object (
810
+ Body = b"" ,
811
+ Bucket = bucket_name ,
812
+ Key = key ,
813
+ )
814
+ version_id = response ["ResponseMetadata" ]["HTTPHeaders" ]["x-amz-version-id" ]
815
+ assert version_id and version_id != "null"
816
+
817
+ response = client .copy_object (
818
+ Bucket = bucket_name ,
819
+ CopySource = {"Bucket" : bucket_name , "Key" : key , "VersionId" : version_id },
820
+ Key = key ,
821
+ )
822
+ assert response ["ResponseMetadata" ]["HTTPStatusCode" ] == 200
823
+
824
+ response = client .copy_object (
825
+ Bucket = bucket_name ,
826
+ CopySource = {"Bucket" : bucket_name , "Key" : key , "VersionId" : "null" },
827
+ Key = key ,
828
+ )
829
+ assert response ["ResponseMetadata" ]["HTTPStatusCode" ] == 200
830
+
831
+ response = client .list_object_versions (
832
+ Bucket = bucket_name ,
833
+ Prefix = key ,
834
+ )
835
+ assert len (response ["Versions" ]) == 4
836
+
837
+
786
838
@mock_aws
787
839
@pytest .mark .parametrize (
788
840
"algorithm" ,
0 commit comments