This is an automated email from the ASF dual-hosted git repository.

shahar1 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new fecccf8eeb5 Fix Amazon provider log messages to show actual values 
(#69967)
fecccf8eeb5 is described below

commit fecccf8eeb5cdf3a05fec61bd96701df69a31266
Author: Hojeong Park <[email protected]>
AuthorDate: Thu Jul 23 03:00:28 2026 +0900

    Fix Amazon provider log messages to show actual values (#69967)
---
 .../src/airflow/providers/amazon/aws/hooks/s3.py   |  2 +-
 .../providers/amazon/aws/sensors/dynamodb.py       |  2 +-
 .../amazon/tests/unit/amazon/aws/hooks/test_s3.py  | 32 +++++++++++++++++++++-
 .../tests/unit/amazon/aws/sensors/test_dynamodb.py |  6 +++-
 4 files changed, 38 insertions(+), 4 deletions(-)

diff --git a/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py 
b/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
index 626ac19730d..e182afef051 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/hooks/s3.py
@@ -831,7 +831,7 @@ class S3Hook(AwsBaseHook):
             if current_num_objects >= min_objects:
                 success_message = (
                     f"SUCCESS: Sensor found {current_num_objects} objects at 
{path}. "
-                    "Waited at least {inactivity_period} seconds, with no new 
objects uploaded."
+                    f"Waited at least {inactivity_period} seconds, with no new 
objects uploaded."
                 )
                 self.log.info(success_message)
                 return {
diff --git 
a/providers/amazon/src/airflow/providers/amazon/aws/sensors/dynamodb.py 
b/providers/amazon/src/airflow/providers/amazon/aws/sensors/dynamodb.py
index c4236054110..8bf1a67f56c 100644
--- a/providers/amazon/src/airflow/providers/amazon/aws/sensors/dynamodb.py
+++ b/providers/amazon/src/airflow/providers/amazon/aws/sensors/dynamodb.py
@@ -122,7 +122,7 @@ class DynamoDBValueSensor(AwsBaseSensor[DynamoDBHook]):
                 item_attribute_value = response["Item"][self.attribute_name]
                 self.log.info("Response: %s", response)
                 self.log.info("Want: %s = %s", self.attribute_name, 
self.attribute_value)
-                self.log.info("Got: {response['Item'][self.attribute_name]} = 
%s", item_attribute_value)
+                self.log.info("Got: %s = %s", self.attribute_name, 
item_attribute_value)
                 return item_attribute_value in (
                     [self.attribute_value] if isinstance(self.attribute_value, 
str) else self.attribute_value
                 )
diff --git a/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py 
b/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
index c4cc20d2231..d45f2642c1d 100644
--- a/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
+++ b/providers/amazon/tests/unit/amazon/aws/hooks/test_s3.py
@@ -22,7 +22,7 @@ import inspect
 import os
 import re
 from collections.abc import Iterator
-from datetime import datetime as std_datetime, timezone
+from datetime import datetime as std_datetime, timedelta, timezone
 from pathlib import Path
 from unittest import mock, mock as async_mock
 from unittest.mock import AsyncMock, MagicMock, Mock, patch
@@ -1137,6 +1137,36 @@ class TestAwsS3Hook:
 
         assert response == {"message": "test_bucket/test between pokes.", 
"status": "error"}
 
+    @pytest.mark.asyncio
+    @mock.patch.object(S3Hook, "_list_keys_async", autospec=True)
+    async def test_s3_key_hook_is_keys_unchanged_success_async(self, 
mock_list_keys, time_machine):
+        frozen_dt = std_datetime(2026, 1, 1, 12, 0, 5, tzinfo=timezone.utc)
+        time_machine.move_to(frozen_dt, tick=False)
+        mock_list_keys.return_value = ["test"]
+
+        s3_hook_async = S3Hook()
+        mock_client = AsyncMock()
+
+        response = await s3_hook_async.is_keys_unchanged_async(
+            client=mock_client,
+            bucket_name="test_bucket",
+            prefix="test",
+            inactivity_period=3,
+            min_objects=1,
+            previous_objects={"test"},
+            inactivity_seconds=0,
+            allow_delete=False,
+            last_activity_time=frozen_dt - timedelta(seconds=5),
+        )
+
+        assert response == {
+            "status": "success",
+            "message": (
+                "SUCCESS: Sensor found 1 objects at test_bucket/test. "
+                "Waited at least 3 seconds, with no new objects uploaded."
+            ),
+        }
+
     @pytest.mark.asyncio
     
@async_mock.patch("airflow.providers.amazon.aws.triggers.s3.S3Hook._list_keys_async")
     async def test_s3_key_hook_is_keys_unchanged_async_handle_tzinfo(self, 
mock_list_keys):
diff --git a/providers/amazon/tests/unit/amazon/aws/sensors/test_dynamodb.py 
b/providers/amazon/tests/unit/amazon/aws/sensors/test_dynamodb.py
index f34acf3aac4..e8ea324ff8c 100644
--- a/providers/amazon/tests/unit/amazon/aws/sensors/test_dynamodb.py
+++ b/providers/amazon/tests/unit/amazon/aws/sensors/test_dynamodb.py
@@ -17,6 +17,8 @@
 
 from __future__ import annotations
 
+from unittest import mock
+
 from moto import mock_aws
 
 from airflow.providers.amazon.aws.hooks.dynamodb import DynamoDBHook
@@ -187,8 +189,9 @@ class TestDynamoDBMultipleValuesSensor:
         assert sensor.hook._verify is None
         assert sensor.hook._config is None
 
+    @mock.patch.object(DynamoDBValueSensor, "log")
     @mock_aws
-    def test_sensor_with_pk(self):
+    def test_sensor_with_pk(self, mock_log):
         hook = DynamoDBHook(table_name=self.table_name, 
table_keys=[self.pk_name])
 
         hook.conn.create_table(
@@ -204,6 +207,7 @@ class TestDynamoDBMultipleValuesSensor:
         hook.write_batch_data(items)
 
         assert self.sensor_pk.poke(None)
+        mock_log.info.assert_any_call("Got: %s = %s", self.attribute_name, 
self.attribute_value[1])
 
     @mock_aws
     def test_sensor_with_pk_and_sk(self):

Reply via email to