From 20a561eda1656841017a528cc5a644327d1762a9 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Thu, 3 Jul 2025 14:17:13 -0400 Subject: [PATCH] s3: test delete_object() with IfMatch Signed-off-by: Casey Bodley --- s3tests_boto3/functional/test_s3.py | 88 +++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/s3tests_boto3/functional/test_s3.py b/s3tests_boto3/functional/test_s3.py index 2b476a16..71e21bb9 100644 --- a/s3tests_boto3/functional/test_s3.py +++ b/s3tests_boto3/functional/test_s3.py @@ -18351,3 +18351,91 @@ def test_put_object_current_if_match(): assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) client.put_object(Bucket=bucket, Key=key, IfNoneMatch=etag) + +@pytest.mark.fails_on_aws # only supported for directory buckets +@pytest.mark.conditional_write +def test_delete_object_if_match(): + client = get_client() + bucket = get_new_bucket(client) + key = 'obj' + + etag = client.put_object(Bucket=bucket, Key=key)['ETag'] + + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, IfMatch='badetag') + assert (412, 'PreconditionFailed') == _get_status_and_error_code(e.response) + + client.delete_object(Bucket=bucket, Key=key, IfMatch=etag) + + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, IfMatch='*') + assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, IfMatch='badetag') + assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) + + # recreate to test IfMatch='*' + client.put_object(Bucket=bucket, Key=key) + client.delete_object(Bucket=bucket, Key=key, IfMatch='*') + +@pytest.mark.fails_on_aws # only supported for directory buckets +@pytest.mark.conditional_write +def test_delete_object_current_if_match(): + client = get_client() + bucket = get_new_bucket(client) + check_configure_versioning_retry(bucket, "Enabled", "Enabled") + key = 'obj' + + # on nonexistent object + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, IfMatch='*') + assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, IfMatch='badetag') + assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) + + response = client.put_object(Bucket=bucket, Key=key) + version = response['VersionId'] + etag = response['ETag'] + + # on current version + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, IfMatch='badetag') + assert (412, 'PreconditionFailed') == _get_status_and_error_code(e.response) + + response = client.delete_object(Bucket=bucket, Key=key, IfMatch=etag) + assert response['DeleteMarker'] + + # on current delete marker + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, IfMatch='*') + assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, IfMatch='badetag') + assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) + + # remove delete marker to retest IfMatch='*' + client.delete_object(Bucket=bucket, Key=key, VersionId=version) + client.delete_object(Bucket=bucket, Key=key, IfMatch='*') + +@pytest.mark.fails_on_aws # only supported for directory buckets +@pytest.mark.conditional_write +def test_delete_object_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) + version = response['VersionId'] + etag = response['ETag'] + + # on specific version + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, VersionId=version, IfMatch='badetag') + assert (412, 'PreconditionFailed') == _get_status_and_error_code(e.response) + + response = client.delete_object(Bucket=bucket, Key=key, VersionId=version, IfMatch=etag) + assert not response['DeleteMarker'] + + # on nonexistent version + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, VersionId=version, IfMatch='*') + assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) + e = assert_raises(ClientError, client.delete_object, Bucket=bucket, Key=key, VersionId=version, IfMatch='badetag') + assert (404, 'NoSuchKey') == _get_status_and_error_code(e.response) + + # recreate to test IfMatch='*' + response = client.put_object(Bucket=bucket, Key=key) + version = response['VersionId'] + client.delete_object(Bucket=bucket, Key=key, VersionId=version, IfMatch='*') -- 2.39.5