11"""Tests for lambda_handler"""
2+ import json
23import sys
34from unittest .mock import patch
45from unittest import TestCase
56from json import loads as json_loads
67from contextlib import ExitStack
78from copy import deepcopy
8- from constants import VACCINE_TYPE_TO_DISEASES_HASH_KEY
9- from elasticache import get_valid_vaccine_types_from_cache
109import fakeredis
1110from boto3 import client as boto3_client
1211from moto import mock_s3 , mock_sqs , mock_firehose , mock_dynamodb
1312
1413from tests .utils_for_tests .generic_setup_and_teardown import GenericSetUp , GenericTearDown
1514from tests .utils_for_tests .utils_for_filenameprocessor_tests import (
16- generate_permissions_config_content ,
17- generate_dict_full_permissions_all_suppliers_and_vaccine_types ,
1815 add_entry_to_table ,
1916 assert_audit_table_entry ,
2017)
2522with patch .dict ("os.environ" , MOCK_ENVIRONMENT_DICT ):
2623 from file_name_processor import lambda_handler , handle_record
2724 from clients import REGION_NAME
28- from constants import PERMISSIONS_CONFIG_FILE_KEY , AUDIT_TABLE_NAME , FileStatus , AuditTableKeys
25+ from constants import AUDIT_TABLE_NAME , FileStatus , AuditTableKeys
2926
3027
3128s3_client = boto3_client ("s3" , region_name = REGION_NAME )
3734# for all vaccine types. This default is overridden for some specific tests.
3835all_vaccine_types_in_this_test_file = ["RSV" , "FLU" ]
3936all_suppliers_in_this_test_file = ["RAVS" , "EMIS" ]
40- all_permissions_config_content = generate_permissions_config_content (
41- generate_dict_full_permissions_all_suppliers_and_vaccine_types (
42- all_suppliers_in_this_test_file , all_vaccine_types_in_this_test_file
43- )
44- )
37+ all_permissions_in_this_test_file = [
38+ f"{ vaccine_type } .CRUDS" for vaccine_type in all_vaccine_types_in_this_test_file
39+ ]
4540
4641
4742@patch .dict ("os.environ" , MOCK_ENVIRONMENT_DICT )
@@ -68,7 +63,7 @@ def run(self, result=None):
6863 # Patch redis_client to use a fake redis client.
6964 patch ("elasticache.redis_client" , new = fakeredis .FakeStrictRedis ()),
7065 # Patch the permissions config to allow all suppliers full permissions for all vaccine types.
71- patch ("elasticache.redis_client.get " , return_value = all_permissions_config_content ),
66+ patch ("elasticache.redis_client.hget " , return_value = json . dumps ( all_permissions_in_this_test_file ) ),
7267 patch ("elasticache.redis_client.hkeys" , return_value = all_vaccine_types_in_this_test_file ),
7368 ]
7469
@@ -148,7 +143,7 @@ def assert_sqs_message(self, file_details: MockFileDetails) -> None:
148143 self .assertEqual (len (received_messages ), 1 )
149144 expected_sqs_message = {
150145 ** file_details .sqs_message_body ,
151- "permission" : [ f" { vaccine_type . upper () } _FULL" for vaccine_type in all_vaccine_types_in_this_test_file ] ,
146+ "permission" : all_permissions_in_this_test_file ,
152147 }
153148 self .assertEqual (json_loads (received_messages [0 ]["Body" ]), expected_sqs_message )
154149
@@ -356,10 +351,9 @@ def test_lambda_invalid_permissions_other_files_in_queue(self):
356351 add_entry_to_table (queued_file_details , FileStatus .QUEUED )
357352
358353 # Mock the supplier permissions with a value which doesn't include the requested Flu permissions
359- permissions_config_content = generate_permissions_config_content ({"EMIS" : ["RSV_DELETE" ]})
360354 with ( # noqa: E999
361355 patch ("file_name_processor.uuid4" , return_value = file_details .message_id ), # noqa: E999
362- patch ("elasticache.redis_client.get " , return_value = permissions_config_content ), # noqa: E999
356+ patch ("elasticache.redis_client.hget " , return_value = None ), # noqa: E999
363357 patch ("file_name_processor.invoke_filename_lambda" ) as mock_invoke_filename_lambda , # noqa: E999
364358 ): # noqa: E999
365359 lambda_handler (self .make_event ([self .make_record (file_details .file_key )]), None )
@@ -451,117 +445,6 @@ def test_lambda_handler_multiple_records_for_same_queue(self):
451445 mock_invoke_filename_lambda .assert_not_called ()
452446
453447
454- @patch .dict ("os.environ" , MOCK_ENVIRONMENT_DICT )
455- @mock_s3
456- @mock_dynamodb
457- @mock_sqs
458- @mock_firehose
459- class TestLambdaHandlerConfig (TestCase ):
460- """Tests for lambda_handler when a config file is uploaded."""
461-
462- config_event = {
463- "Records" : [{"s3" : {"bucket" : {"name" : BucketNames .CONFIG }, "object" : {"key" : PERMISSIONS_CONFIG_FILE_KEY }}}]
464- }
465-
466- def setUp (self ):
467- GenericSetUp (s3_client , firehose_client , sqs_client , dynamodb_client )
468-
469- self .fake_redis = fakeredis .FakeStrictRedis (decode_responses = True )
470- self .fake_redis .hmset (VACCINE_TYPE_TO_DISEASES_HASH_KEY , {"RSV" : "[]" })
471- redis_patcher = patch ("elasticache.redis_client" , new = self .fake_redis )
472- self .addCleanup (redis_patcher .stop )
473- redis_patcher .start ()
474-
475- def tearDown (self ):
476- GenericTearDown (s3_client , firehose_client , sqs_client , dynamodb_client )
477-
478- def test_elasticcache_failure_handled (self ):
479- "Tests if elastic cache failure is handled when service fails to send message"
480- event = {
481- "s3" : {
482- "bucket" : {"name" : "my-config-bucket" }, # triggers 'config' branch
483- "object" : {"key" : "testfile.csv" }
484- }
485- }
486-
487- with (
488- patch ("file_name_processor.upload_to_elasticache" , side_effect = Exception ("Upload failed" )),
489- patch ("file_name_processor.logger" ) as mock_logger
490- ):
491-
492- result = handle_record (event )
493-
494- self .assertEqual (result ["statusCode" ], 500 )
495- self .assertEqual (result ["message" ], "Failed to upload file content to cache" )
496- self .assertEqual (result ["file_key" ], "testfile.csv" )
497- self .assertIn ("error" , result )
498-
499- mock_logger .error .assert_called_once ()
500- logged_msg = mock_logger .error .call_args [0 ][0 ]
501- self .assertIn ("Error uploading to cache" , logged_msg )
502-
503- def test_successful_processing_from_configs (self ):
504- """Tests that the permissions config file content is uploaded to elasticache successfully"""
505- ravs_rsv_file_details_1 = MockFileDetails .ravs_rsv_1
506- ravs_rsv_file_details_2 = MockFileDetails .ravs_rsv_2
507- s3_client .put_object (Bucket = BucketNames .SOURCE , Key = ravs_rsv_file_details_1 .file_key )
508- s3_client .put_object (Bucket = BucketNames .SOURCE , Key = ravs_rsv_file_details_2 .file_key )
509- record_1 = {"s3" : {"bucket" : {"name" : BucketNames .SOURCE }, "object" : {"key" : ravs_rsv_file_details_1 .file_key }}}
510- record_2 = {"s3" : {"bucket" : {"name" : BucketNames .SOURCE }, "object" : {"key" : ravs_rsv_file_details_2 .file_key }}}
511-
512- ravs_rsv_permissions = {"RAVS" : ["RSV_FULL" ], "EMIS" : ["FLU_CREATE" , "FLU_UPDATE" ]}
513- ravs_no_rsv_permissions = {"RAVS" : ["FLU_FULL" ], "EMIS" : ["RSV_CREATE" , "RSV_UPDATE" ], "TPP" : ["RSV_DELETE" ]}
514-
515- # Test that the permissions config file content is uploaded to elasticache successfully
516- s3_client .put_object (
517- Bucket = BucketNames .CONFIG ,
518- Key = PERMISSIONS_CONFIG_FILE_KEY ,
519- Body = generate_permissions_config_content (ravs_rsv_permissions ),
520- )
521- lambda_handler (self .config_event , None )
522- self .assertEqual (
523- json_loads (self .fake_redis .get (PERMISSIONS_CONFIG_FILE_KEY )), {"all_permissions" : ravs_rsv_permissions }
524- )
525-
526- # Check that a RAVS RSV file processes successfully (as RAVS has permissions for RSV)
527- with patch ("file_name_processor.uuid4" , return_value = ravs_rsv_file_details_1 .message_id ):
528- result = handle_record (record_1 )
529- expected_result = {
530- "statusCode" : 200 ,
531- "message" : "Successfully sent to SQS for further processing" ,
532- "file_key" : ravs_rsv_file_details_1 .file_key ,
533- "message_id" : ravs_rsv_file_details_1 .message_id ,
534- "vaccine_type" : ravs_rsv_file_details_1 .vaccine_type ,
535- "supplier" : ravs_rsv_file_details_1 .supplier
536- }
537- self .assertEqual (result , expected_result )
538-
539- # Test that the elasticache is successfully updated when the lambda is invoked with a new permissions config
540- s3_client .put_object (
541- Bucket = BucketNames .CONFIG ,
542- Key = PERMISSIONS_CONFIG_FILE_KEY ,
543- Body = generate_permissions_config_content (ravs_no_rsv_permissions ),
544- )
545- lambda_handler (self .config_event , None )
546- self .assertEqual (
547- json_loads (self .fake_redis .get (PERMISSIONS_CONFIG_FILE_KEY )), {"all_permissions" : ravs_no_rsv_permissions }
548- )
549-
550- # Check that a RAVS RSV file fails to process (as RAVS now does not have permissions for RSV)
551- with patch ("file_name_processor.uuid4" , return_value = ravs_rsv_file_details_2 .message_id ):
552- result = handle_record (record_2 )
553- expected_result = {
554- "statusCode" : 403 ,
555- "message" : "Infrastructure Level Response Value - Processing Error" ,
556- "file_key" : ravs_rsv_file_details_2 .file_key ,
557- "message_id" : ravs_rsv_file_details_2 .message_id ,
558- "error" : "Initial file validation failed: RAVS does not have permissions for RSV" ,
559- "vaccine_type" : ravs_rsv_file_details_2 .vaccine_type ,
560- "supplier" : ravs_rsv_file_details_2 .supplier
561- }
562- self .assertEqual (result , expected_result )
563-
564-
565448@patch .dict ("os.environ" , MOCK_ENVIRONMENT_DICT )
566449@mock_s3
567450@mock_dynamodb
0 commit comments