Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions aws_lambda_powertools/utilities/idempotency/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ def _process_idempotency(self, is_replay: bool):
# We give preference to ReturnValuesOnConditionCheckFailure because it is a faster and more cost-effective
# way of retrieving the existing record after a failed conditional write operation.
record = exc.old_data_record or self._get_idempotency_record()
if is_replay and record is not None and record.status == "INPROGRESS":
if is_replay and record is not None and record.status == STATUS_CONSTANTS["INPROGRESS"]:
return self._get_function_response()
# If a record is found, handle it for status
if record:
Expand Down Expand Up @@ -296,7 +296,7 @@ def _get_function_response(self):

else:
try:
serialized_response: dict = self.output_serializer.to_dict(response) if response else None
serialized_response: dict = self.output_serializer.to_dict(response) if response is not None else None
self.persistence_store.save_success(data=self.data, result=serialized_response)
except Exception as save_exception:
raise IdempotencyPersistenceLayerError(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,8 @@ def _item_to_data_record(self, idempotency_key: str, item: dict[str, Any]) -> Da
idempotency_key=idempotency_key,
status=item[self.status_attr],
in_progress_expiry_timestamp=in_progress_expiry_timestamp,
response_data=str(item.get(self.data_attr)),
payload_hash=str(item.get(self.validation_key_attr)),
response_data=item.get(self.data_attr, ""),
payload_hash=item.get(self.validation_key_attr, ""),
expiry_timestamp=item.get("expiration"),
)

Expand Down
19 changes: 19 additions & 0 deletions tests/functional/idempotency/_redis/test_redis_layer.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,25 @@ def test_item_to_datarecord_conversion(valid_record):
assert record.in_progress_expiry_timestamp == item[layer.in_progress_expiry_attr]


def test_item_to_datarecord_conversion_missing_optional_attributes(persistence_store_standalone_redis):
"""
When data_attr or validation_key_attr is missing from Redis,
response_data and payload_hash should be empty string, not the string "None".
Regression test for: https://github.com/aws-powertools/powertools-lambda-python/issues/8090
"""
idempotency_key = "test-func#abc123"
item = {
persistence_store_standalone_redis.status_attr: "COMPLETED",
persistence_store_standalone_redis.expiry_attr: 9999999999,
# data_attr and validation_key_attr intentionally absent
}

record = persistence_store_standalone_redis._item_to_data_record(idempotency_key, item)

assert record.response_data == ""
assert record.payload_hash == ""


def test_idempotent_function_and_lambda_handler_redis_basic(
persistence_store_standalone_redis: RedisCachePersistenceLayer,
lambda_context,
Expand Down
Loading