From 8f7eae5fbf9027f5a7d80198eebad3a5576bcacc Mon Sep 17 00:00:00 2001 From: tianyizhuang Date: Tue, 28 Apr 2026 02:56:14 +0800 Subject: [PATCH 1/2] test(bindings/python): add focused behavior tests for write conditional options Adds tests verifying write() accepts if_match, if_none_match, and if_not_exists parameters for both sync and async operators. These options were already exposed in the Python API but lacked dedicated behavior tests. Co-Authored-By: Claude Sonnet 4.6 --- .../python/tests/test_write_conditional.py | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 bindings/python/tests/test_write_conditional.py diff --git a/bindings/python/tests/test_write_conditional.py b/bindings/python/tests/test_write_conditional.py new file mode 100644 index 000000000000..e7615ad48582 --- /dev/null +++ b/bindings/python/tests/test_write_conditional.py @@ -0,0 +1,65 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +from uuid import uuid4 + +import pytest + + +@pytest.mark.need_capability("write") +def test_write_accepts_if_match_param(service_name, operator, async_operator): + path = f"test_write_if_match_{uuid4()}.txt" + operator.write(path, b"test content", if_match="etag123") + + +@pytest.mark.need_capability("write") +def test_write_accepts_if_none_match_param(service_name, operator, async_operator): + path = f"test_write_if_none_match_{uuid4()}.txt" + operator.write(path, b"test content", if_none_match="etag456") + + +@pytest.mark.need_capability("write") +def test_write_accepts_if_not_exists_param(service_name, operator, async_operator): + path = f"test_write_if_not_exists_{uuid4()}.txt" + operator.write(path, b"test content", if_not_exists=True) + + +@pytest.mark.need_capability("write") +def test_write_default_params_unchanged(service_name, operator, async_operator): + path = f"test_write_default_{uuid4()}.txt" + operator.write(path, b"test content") + + +@pytest.mark.need_capability("write") +@pytest.mark.asyncio +async def test_async_write_accepts_if_match_param(service_name, operator, async_operator): + path = f"test_async_write_if_match_{uuid4()}.txt" + await async_operator.write(path, b"test content", if_match="etag123") + + +@pytest.mark.need_capability("write") +@pytest.mark.asyncio +async def test_async_write_accepts_if_none_match_param(service_name, operator, async_operator): + path = f"test_async_write_if_none_match_{uuid4()}.txt" + await async_operator.write(path, b"test content", if_none_match="etag456") + + +@pytest.mark.need_capability("write") +@pytest.mark.asyncio +async def test_async_write_accepts_if_not_exists_param(service_name, operator, async_operator): + path = f"test_async_write_if_not_exists_{uuid4()}.txt" + await async_operator.write(path, b"test content", if_not_exists=True) From a0dbd4f05555db1bf8f346a9be3bb6170ae51456 Mon Sep 17 00:00:00 2001 From: tianyizhuang Date: Tue, 28 Apr 2026 03:22:25 +0800 Subject: [PATCH 2/2] fix(bindings/python): gate write conditional tests on specific capabilities and fix line length --- .../python/tests/test_write_conditional.py | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/bindings/python/tests/test_write_conditional.py b/bindings/python/tests/test_write_conditional.py index e7615ad48582..c2b36a1802aa 100644 --- a/bindings/python/tests/test_write_conditional.py +++ b/bindings/python/tests/test_write_conditional.py @@ -20,20 +20,24 @@ import pytest -@pytest.mark.need_capability("write") +@pytest.mark.need_capability("write", "write_with_if_match") def test_write_accepts_if_match_param(service_name, operator, async_operator): path = f"test_write_if_match_{uuid4()}.txt" operator.write(path, b"test content", if_match="etag123") -@pytest.mark.need_capability("write") -def test_write_accepts_if_none_match_param(service_name, operator, async_operator): +@pytest.mark.need_capability("write", "write_with_if_none_match") +def test_write_accepts_if_none_match_param( + service_name, operator, async_operator +): path = f"test_write_if_none_match_{uuid4()}.txt" operator.write(path, b"test content", if_none_match="etag456") -@pytest.mark.need_capability("write") -def test_write_accepts_if_not_exists_param(service_name, operator, async_operator): +@pytest.mark.need_capability("write", "write_with_if_not_exists") +def test_write_accepts_if_not_exists_param( + service_name, operator, async_operator +): path = f"test_write_if_not_exists_{uuid4()}.txt" operator.write(path, b"test content", if_not_exists=True) @@ -44,22 +48,28 @@ def test_write_default_params_unchanged(service_name, operator, async_operator): operator.write(path, b"test content") -@pytest.mark.need_capability("write") +@pytest.mark.need_capability("write", "write_with_if_match") @pytest.mark.asyncio -async def test_async_write_accepts_if_match_param(service_name, operator, async_operator): +async def test_async_write_accepts_if_match_param( + service_name, operator, async_operator +): path = f"test_async_write_if_match_{uuid4()}.txt" await async_operator.write(path, b"test content", if_match="etag123") -@pytest.mark.need_capability("write") +@pytest.mark.need_capability("write", "write_with_if_none_match") @pytest.mark.asyncio -async def test_async_write_accepts_if_none_match_param(service_name, operator, async_operator): +async def test_async_write_accepts_if_none_match_param( + service_name, operator, async_operator +): path = f"test_async_write_if_none_match_{uuid4()}.txt" await async_operator.write(path, b"test content", if_none_match="etag456") -@pytest.mark.need_capability("write") +@pytest.mark.need_capability("write", "write_with_if_not_exists") @pytest.mark.asyncio -async def test_async_write_accepts_if_not_exists_param(service_name, operator, async_operator): +async def test_async_write_accepts_if_not_exists_param( + service_name, operator, async_operator +): path = f"test_async_write_if_not_exists_{uuid4()}.txt" await async_operator.write(path, b"test content", if_not_exists=True)