Skip to content

Commit 1b39f31

Browse files
committed
make pr
1 parent f2e818e commit 1b39f31

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

aws_lambda_powertools/utilities/idempotency/base.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ def _get_idempotency_record(self) -> Optional[DataRecord]:
182182

183183
return data_record
184184

185-
def _handle_for_status(self, data_record: DataRecord) -> Optional[Dict[Any, Any]]:
185+
def _handle_for_status(self, data_record: DataRecord) -> Optional[Any]:
186186
"""
187187
Take appropriate action based on data_record's status
188188
@@ -192,8 +192,9 @@ def _handle_for_status(self, data_record: DataRecord) -> Optional[Dict[Any, Any]
192192
193193
Returns
194194
-------
195-
Optional[Dict[Any, Any]
195+
Optional[Any]
196196
Function's response previously used for this idempotency key, if it has successfully executed already.
197+
In case an output serializer is configured, the response is deserialized.
197198
198199
Raises
199200
------
@@ -219,7 +220,7 @@ def _handle_for_status(self, data_record: DataRecord) -> Optional[Dict[Any, Any]
219220
f"{self.persistence_store.event_key_jmespath}={data_record.idempotency_key}",
220221
)
221222
response_dict: Optional[dict] = data_record.response_json_as_dict()
222-
return self.output_serializer.from_dict(response_dict)
223+
return self.output_serializer.from_dict(response_dict) if response_dict else None
223224

224225
def _get_function_response(self):
225226
try:
@@ -238,7 +239,7 @@ def _get_function_response(self):
238239

239240
else:
240241
try:
241-
serialized_response: dict = self.output_serializer.to_dict(response)
242+
serialized_response: dict = self.output_serializer.to_dict(response) if response else None
242243
self.persistence_store.save_success(data=self.data, result=serialized_response)
243244
except Exception as save_exception:
244245
raise IdempotencyPersistenceLayerError(

tests/functional/idempotency/test_idempotency.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,6 +1237,47 @@ def record_handler(record):
12371237
assert from_dict_called
12381238

12391239

1240+
def test_idempotent_function_serialization_no_response():
1241+
# GIVEN
1242+
config = IdempotencyConfig(use_local_cache=True)
1243+
mock_event = {"customer_id": "fake", "transaction_id": "fake-id"}
1244+
idempotency_key = f"{TESTS_MODULE_PREFIX}.test_idempotent_function_serialization_no_response.<locals>.record_handler#{hash_idempotency_key(mock_event)}" # noqa E501
1245+
persistence_layer = MockPersistenceLayer(expected_idempotency_key=idempotency_key)
1246+
1247+
to_dict_called = False
1248+
from_dict_called = False
1249+
1250+
def to_dict(data):
1251+
nonlocal to_dict_called
1252+
to_dict_called = True
1253+
return data
1254+
1255+
def from_dict(data):
1256+
nonlocal from_dict_called
1257+
from_dict_called = True
1258+
return data
1259+
1260+
output_serializer = CustomDictSerializer(
1261+
to_dict=to_dict,
1262+
from_dict=from_dict,
1263+
)
1264+
1265+
@idempotent_function(
1266+
persistence_store=persistence_layer,
1267+
data_keyword_argument="record",
1268+
config=config,
1269+
output_serializer=output_serializer,
1270+
)
1271+
def record_handler(record):
1272+
return None
1273+
1274+
record_handler(record=mock_event)
1275+
assert to_dict_called is False, "in case response is None, to_dict should not be called"
1276+
response = record_handler(record=mock_event)
1277+
assert response is None
1278+
assert from_dict_called is False, "in case response is None, from_dict should not be called"
1279+
1280+
12401281
def test_idempotent_function_serialization_pydantic():
12411282
# GIVEN
12421283
config = IdempotencyConfig(use_local_cache=True)

0 commit comments

Comments
 (0)