Skip to content

Commit 3cb7411

Browse files
committed
chore(idempotency): added tests for handle_for_status
1 parent 228a76d commit 3cb7411

File tree

2 files changed

+61
-5
lines changed

2 files changed

+61
-5
lines changed

aws_lambda_powertools/utilities/idempotency/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def _handle_for_status(self, data_record: DataRecord) -> Optional[Dict[Any, Any]
191191

192192
if data_record.status == STATUS_CONSTANTS["INPROGRESS"]:
193193
if data_record.in_progress_expiry_timestamp is not None and data_record.in_progress_expiry_timestamp < int(
194-
datetime.datetime.now().timestamp()
194+
datetime.datetime.now().timestamp() * 1000
195195
):
196196
raise IdempotencyInconsistentStateError(
197197
"item should have been expired in-progress because it already time-outed."

tests/functional/idempotency/test_idempotency.py

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from aws_lambda_powertools.utilities.data_classes import APIGatewayProxyEventV2, event_source
1414
from aws_lambda_powertools.utilities.idempotency import DynamoDBPersistenceLayer, IdempotencyConfig
15-
from aws_lambda_powertools.utilities.idempotency.base import MAX_RETRIES, _prepare_data
15+
from aws_lambda_powertools.utilities.idempotency.base import MAX_RETRIES, IdempotencyHandler, _prepare_data
1616
from aws_lambda_powertools.utilities.idempotency.exceptions import (
1717
IdempotencyAlreadyInProgressError,
1818
IdempotencyInconsistentStateError,
@@ -692,7 +692,7 @@ def test_idempotent_lambda_expires_in_progress_before_expire(
692692

693693
now = datetime.datetime.now()
694694
period = datetime.timedelta(seconds=5)
695-
timestamp_expires_in_progress = str(int((now + period).timestamp()))
695+
timestamp_expires_in_progress = int((now + period).timestamp() * 1000)
696696

697697
expected_params_get_item = {
698698
"TableName": TABLE_NAME,
@@ -703,7 +703,7 @@ def test_idempotent_lambda_expires_in_progress_before_expire(
703703
"Item": {
704704
"id": {"S": hashed_idempotency_key},
705705
"expiration": {"N": timestamp_future},
706-
"in_progress_expiration": {"N": timestamp_expires_in_progress},
706+
"in_progress_expiration": {"N": str(timestamp_expires_in_progress)},
707707
"data": {"S": '{"message": "test", "statusCode": 200'},
708708
"status": {"S": "INPROGRESS"},
709709
}
@@ -748,7 +748,7 @@ def test_idempotent_lambda_expires_in_progress_after_expire(
748748
"Item": {
749749
"id": {"S": hashed_idempotency_key},
750750
"expiration": {"N": timestamp_future},
751-
"in_progress_expiration": {"N": str(int(one_second_ago.timestamp()))},
751+
"in_progress_expiration": {"N": str(int(one_second_ago.timestamp() * 1000))},
752752
"data": {"S": '{"message": "test", "statusCode": 200'},
753753
"status": {"S": "INPROGRESS"},
754754
}
@@ -816,6 +816,62 @@ def test_data_record_json_to_dict_mapping_when_response_data_none():
816816
assert response_data is None
817817

818818

819+
@pytest.mark.parametrize("idempotency_config", [{"use_local_cache": True}], indirect=True)
820+
def test_handler_for_status_expired_data_record(
821+
idempotency_config: IdempotencyConfig, persistence_store: DynamoDBPersistenceLayer
822+
):
823+
idempotency_handler = IdempotencyHandler(
824+
function=lambda a: a,
825+
function_payload={},
826+
config=idempotency_config,
827+
persistence_store=persistence_store,
828+
)
829+
data_record = DataRecord("key", status="EXPIRED", response_data=None)
830+
831+
with pytest.raises(IdempotencyInconsistentStateError):
832+
idempotency_handler._handle_for_status(data_record)
833+
834+
835+
@pytest.mark.parametrize("idempotency_config", [{"use_local_cache": True}], indirect=True)
836+
def test_handler_for_status_inprogress_data_record_inconsistent(
837+
idempotency_config: IdempotencyConfig, persistence_store: DynamoDBPersistenceLayer
838+
):
839+
idempotency_handler = IdempotencyHandler(
840+
function=lambda a: a,
841+
function_payload={},
842+
config=idempotency_config,
843+
persistence_store=persistence_store,
844+
)
845+
846+
now = datetime.datetime.now()
847+
period = datetime.timedelta(milliseconds=100)
848+
timestamp = int((now - period).timestamp() * 1000)
849+
data_record = DataRecord("key", in_progress_expiry_timestamp=timestamp, status="INPROGRESS", response_data=None)
850+
851+
with pytest.raises(IdempotencyInconsistentStateError):
852+
idempotency_handler._handle_for_status(data_record)
853+
854+
855+
@pytest.mark.parametrize("idempotency_config", [{"use_local_cache": True}], indirect=True)
856+
def test_handler_for_status_inprogress_data_record_consistent(
857+
idempotency_config: IdempotencyConfig, persistence_store: DynamoDBPersistenceLayer
858+
):
859+
idempotency_handler = IdempotencyHandler(
860+
function=lambda a: a,
861+
function_payload={},
862+
config=idempotency_config,
863+
persistence_store=persistence_store,
864+
)
865+
866+
now = datetime.datetime.now()
867+
period = datetime.timedelta(milliseconds=100)
868+
timestamp = int((now + period).timestamp() * 1000)
869+
data_record = DataRecord("key", in_progress_expiry_timestamp=timestamp, status="INPROGRESS", response_data=None)
870+
871+
with pytest.raises(IdempotencyAlreadyInProgressError):
872+
idempotency_handler._handle_for_status(data_record)
873+
874+
819875
@pytest.mark.parametrize("idempotency_config", [{"use_local_cache": True}], indirect=True)
820876
def test_in_progress_never_saved_to_cache(
821877
idempotency_config: IdempotencyConfig, persistence_store: DynamoDBPersistenceLayer

0 commit comments

Comments
 (0)