Skip to content

Commit 94c202e

Browse files
Merge branch 'develop' into feat/8169
2 parents ae71395 + 08c9921 commit 94c202e

3 files changed

Lines changed: 23 additions & 4 deletions

File tree

aws_lambda_powertools/utilities/idempotency/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ def _process_idempotency(self, is_replay: bool):
167167
# We give preference to ReturnValuesOnConditionCheckFailure because it is a faster and more cost-effective
168168
# way of retrieving the existing record after a failed conditional write operation.
169169
record = exc.old_data_record or self._get_idempotency_record()
170-
if is_replay and record is not None and record.status == "INPROGRESS":
170+
if is_replay and record is not None and record.status == STATUS_CONSTANTS["INPROGRESS"]:
171171
return self._get_function_response()
172172
# If a record is found, handle it for status
173173
if record:
@@ -296,7 +296,7 @@ def _get_function_response(self):
296296

297297
else:
298298
try:
299-
serialized_response: dict = self.output_serializer.to_dict(response) if response else None
299+
serialized_response: dict = self.output_serializer.to_dict(response) if response is not None else None
300300
self.persistence_store.save_success(data=self.data, result=serialized_response)
301301
except Exception as save_exception:
302302
raise IdempotencyPersistenceLayerError(

aws_lambda_powertools/utilities/idempotency/persistence/redis.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,8 @@ def _item_to_data_record(self, idempotency_key: str, item: dict[str, Any]) -> Da
332332
idempotency_key=idempotency_key,
333333
status=item[self.status_attr],
334334
in_progress_expiry_timestamp=in_progress_expiry_timestamp,
335-
response_data=str(item.get(self.data_attr)),
336-
payload_hash=str(item.get(self.validation_key_attr)),
335+
response_data=item.get(self.data_attr, ""),
336+
payload_hash=item.get(self.validation_key_attr, ""),
337337
expiry_timestamp=item.get("expiration"),
338338
)
339339

tests/functional/idempotency/_redis/test_redis_layer.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,25 @@ def test_item_to_datarecord_conversion(valid_record):
330330
assert record.in_progress_expiry_timestamp == item[layer.in_progress_expiry_attr]
331331

332332

333+
def test_item_to_datarecord_conversion_missing_optional_attributes(persistence_store_standalone_redis):
334+
"""
335+
When data_attr or validation_key_attr is missing from Redis,
336+
response_data and payload_hash should be empty string, not the string "None".
337+
Regression test for: https://github.com/aws-powertools/powertools-lambda-python/issues/8090
338+
"""
339+
idempotency_key = "test-func#abc123"
340+
item = {
341+
persistence_store_standalone_redis.status_attr: "COMPLETED",
342+
persistence_store_standalone_redis.expiry_attr: 9999999999,
343+
# data_attr and validation_key_attr intentionally absent
344+
}
345+
346+
record = persistence_store_standalone_redis._item_to_data_record(idempotency_key, item)
347+
348+
assert record.response_data == ""
349+
assert record.payload_hash == ""
350+
351+
333352
def test_idempotent_function_and_lambda_handler_redis_basic(
334353
persistence_store_standalone_redis: RedisCachePersistenceLayer,
335354
lambda_context,

0 commit comments

Comments
 (0)