From d9c90411b92417a7067138a127bdc0ddbc6e9ba6 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Thu, 3 Jul 2025 16:42:14 -0400 Subject: [PATCH] s3: test delete_objects() with ETag Signed-off-by: Casey Bodley --- s3tests_boto3/functional/test_s3.py | 60 +++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/s3tests_boto3/functional/test_s3.py b/s3tests_boto3/functional/test_s3.py index 93418a30..a69badda 100644 --- a/s3tests_boto3/functional/test_s3.py +++ b/s3tests_boto3/functional/test_s3.py @@ -18567,3 +18567,63 @@ def test_delete_object_version_if_match_size(): e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, VersionId=version, IfMatchSize=badsize) assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) + +@pytest.mark.fails_on_aws # only supported for directory buckets +@pytest.mark.conditional_write +def test_delete_objects_if_match(): + client = get_client() + bucket = get_new_bucket(client) + key = 'obj' + + etag = client.put_object(Bucket=bucket, Key=key)['ETag'] + + response = client.delete_objects(Bucket=bucket, Delete={'Objects': [{'Key': key, 'ETag': 'badetag'}]}) + assert 'PreconditionFailed' == response['Errors'][0]['Code'] + + response = client.delete_objects(Bucket=bucket, Delete={'Objects': [{'Key': key, 'ETag': etag}]}) + assert key == response['Deleted'][0]['Key'] # success + + response = client.delete_objects(Bucket=bucket, Delete={'Objects': [{'Key': key, 'ETag': 'badetag'}]}) + assert 'NoSuchKey' == response['Errors'][0]['Code'] + +@pytest.mark.fails_on_aws # only supported for directory buckets +@pytest.mark.conditional_write +def test_delete_objects_current_if_match(): + client = get_client() + bucket = get_new_bucket(client) + check_configure_versioning_retry(bucket, "Enabled", "Enabled") + key = 'obj' + + etag = client.put_object(Bucket=bucket, Key=key)['ETag'] + + response = client.delete_objects(Bucket=bucket, Delete={'Objects': [{'Key': key, 'ETag': 'badetag'}]}) + assert 'PreconditionFailed' == response['Errors'][0]['Code'] + + response = client.delete_objects(Bucket=bucket, Delete={'Objects': [{'Key': key, 'ETag': etag}]}) + assert key == response['Deleted'][0]['Key'] # success + assert response['Deleted'][0]['DeleteMarker'] + + response = client.delete_objects(Bucket=bucket, Delete={'Objects': [{'Key': key, 'ETag': 'badetag'}]}) + assert 'NoSuchKey' == response['Errors'][0]['Code'] + +@pytest.mark.fails_on_aws # only supported for directory buckets +@pytest.mark.conditional_write +def test_delete_objects_version_if_match(): + client = get_client() + bucket = get_new_bucket(client) + check_configure_versioning_retry(bucket, "Enabled", "Enabled") + key = 'obj' + + response = client.put_object(Bucket=bucket, Key=key) + etag = response['ETag'] + version = response['VersionId'] + + response = client.delete_objects(Bucket=bucket, Delete={'Objects': [{'Key': key, 'VersionId': version, 'ETag': 'badetag'}]}) + assert 'PreconditionFailed' == response['Errors'][0]['Code'] + + response = client.delete_objects(Bucket=bucket, Delete={'Objects': [{'Key': key, 'VersionId': version, 'ETag': etag}]}) + assert key == response['Deleted'][0]['Key'] # success + assert not response['Deleted'][0]['DeleteMarker'] + + response = client.delete_objects(Bucket=bucket, Delete={'Objects': [{'Key': key, 'VersionId': version, 'ETag': 'badetag'}]}) + assert 'NoSuchKey' == response['Errors'][0]['Code'] -- 2.39.5