@@ -1963,3 +1963,54 @@ def lambda_handler(event, context):
1963
1963
1964
1964
stubber .assert_no_pending_responses ()
1965
1965
stubber .deactivate ()
1966
+
1967
+
1968
+ @pytest .mark .parametrize ("idempotency_config" , [{"use_local_cache" : False }, {"use_local_cache" : True }], indirect = True )
1969
+ def test_idempotent_lambda_already_completed_response_hook_is_called_with_none (
1970
+ idempotency_config : IdempotencyConfig ,
1971
+ persistence_store : DynamoDBPersistenceLayer ,
1972
+ lambda_apigw_event ,
1973
+ timestamp_future ,
1974
+ hashed_idempotency_key ,
1975
+ lambda_context ,
1976
+ ):
1977
+ """
1978
+ Test idempotent decorator where event with matching event key has already been successfully processed
1979
+ """
1980
+
1981
+ def idempotent_response_hook (response : Any , idempotent_data : DataRecord ) -> Any :
1982
+ """Modify the response provided by adding a new key"""
1983
+ new_response : dict = {}
1984
+ new_response ["idempotent_response" ] = True
1985
+ new_response ["response" ] = response
1986
+ new_response ["idempotent_expiration" ] = idempotent_data .get_expiration_datetime ()
1987
+
1988
+ return new_response
1989
+
1990
+ idempotency_config .response_hook = idempotent_response_hook
1991
+
1992
+ stubber = stub .Stubber (persistence_store .client )
1993
+ ddb_response = {
1994
+ "Item" : {
1995
+ "id" : {"S" : hashed_idempotency_key },
1996
+ "expiration" : {"N" : timestamp_future },
1997
+ "data" : {"S" : "null" },
1998
+ "status" : {"S" : "COMPLETED" },
1999
+ },
2000
+ }
2001
+ stubber .add_client_error ("put_item" , "ConditionalCheckFailedException" , modeled_fields = ddb_response )
2002
+ stubber .activate ()
2003
+
2004
+ @idempotent (config = idempotency_config , persistence_store = persistence_store )
2005
+ def lambda_handler (event , context ):
2006
+ raise Exception
2007
+
2008
+ lambda_resp = lambda_handler (lambda_apigw_event , lambda_context )
2009
+
2010
+ # Then idempotent_response value will be added to the response
2011
+ assert lambda_resp ["idempotent_response" ]
2012
+ assert lambda_resp ["response" ] is None
2013
+ assert lambda_resp ["idempotent_expiration" ] == datetime .datetime .fromtimestamp (int (timestamp_future ))
2014
+
2015
+ stubber .assert_no_pending_responses ()
2016
+ stubber .deactivate ()
0 commit comments