55from json import loads as json_loads
66from copy import deepcopy
77from moto import mock_sqs
8- from boto3 import client as boto3_client
8+ import boto3
99
1010from tests .utils_for_tests .mock_environment_variables import MOCK_ENVIRONMENT_DICT , Sqs
1111from tests .utils_for_tests .values_for_tests import MockFileDetails
1616 from errors import UnhandledSqsError , InvalidSupplierError
1717 from clients import REGION_NAME
1818
19- sqs_client = boto3_client ("sqs" , region_name = REGION_NAME )
20-
2119FLU_EMIS_FILE_DETAILS = MockFileDetails .emis_flu
2220RSV_RAVS_FILE_DETAILS = MockFileDetails .ravs_rsv_1
21+ fake_queue_url = "https://sqs.eu-west-2.amazonaws.com/123456789012/non_existent_queue"
2322
2423NON_EXISTENT_QUEUE_ERROR_MESSAGE = (
2524 "An unexpected error occurred whilst sending to SQS: An error occurred (AWS.SimpleQueueService.NonExistent"
3231class TestSendSQSMessage (TestCase ):
3332 """Tests for send_sqs_message functions"""
3433
34+ def setUp (self ):
35+ self .sqs_client = boto3 .client ("sqs" , region_name = REGION_NAME )
36+ self .queue_url = self .sqs_client .create_queue (
37+ QueueName = Sqs .QUEUE_NAME , Attributes = Sqs .ATTRIBUTES
38+ )["QueueUrl" ]
39+
3540 def test_send_to_supplier_queue_success (self ):
3641 """Test send_to_supplier_queue function for a successful message send"""
37- # Set up the sqs_queue
38- queue_url = sqs_client .create_queue (QueueName = Sqs .QUEUE_NAME , Attributes = Sqs .ATTRIBUTES )["QueueUrl" ]
39-
40- # Send three separate messages to the queue to test that they are all received and appropriately
41- # partitioned by supplier and vaccine_type
4242 flu_emis_1 = deepcopy (FLU_EMIS_FILE_DETAILS )
4343 flu_emis_2 = deepcopy (FLU_EMIS_FILE_DETAILS )
4444 flu_emis_2 .sqs_message_body ["message_id" ] = "flu_emis_test_id_2"
4545 rsv_ravs_1 = deepcopy (RSV_RAVS_FILE_DETAILS )
4646
47- for file_details in [flu_emis_1 , rsv_ravs_1 , flu_emis_2 ]:
48- self .assertIsNone (
49- send_to_supplier_queue (
50- message_body = deepcopy (file_details .sqs_message_body ),
51- vaccine_type = file_details .vaccine_type ,
52- supplier = file_details .supplier ,
47+ with patch .dict ("os.environ" , {"QUEUE_URL" : self .queue_url }):
48+ with patch ("send_sqs_message.sqs_client" , self .sqs_client ):
49+ for file_details in [flu_emis_1 , rsv_ravs_1 , flu_emis_2 ]:
50+ self .assertIsNone (
51+ send_to_supplier_queue (
52+ message_body = deepcopy (file_details .sqs_message_body ),
53+ vaccine_type = file_details .vaccine_type ,
54+ supplier = file_details .supplier ,
55+ )
5356 )
54- )
5557
56- # Check that the FIFO queue contains the expected messages, in correct order, and with correct MessageGroupId
57- received_messages = sqs_client .receive_message (
58- QueueUrl = queue_url , MaxNumberOfMessages = 10 , AttributeNames = ["All" ]
59- )["Messages" ]
58+ # Verify messages in queue
59+ messages = self . sqs_client .receive_message (
60+ QueueUrl = self . queue_url , MaxNumberOfMessages = 10 , AttributeNames = ["All" ]
61+ )["Messages" ]
6062
61- self .assertEqual (len (received_messages ), 3 )
62- self .assertEqual (json_loads (received_messages [0 ]["Body" ]), flu_emis_1 .sqs_message_body )
63- self .assertEqual (received_messages [0 ]["Attributes" ]["MessageGroupId" ], flu_emis_1 .queue_name )
64- self .assertEqual (json_loads (received_messages [1 ]["Body" ]), rsv_ravs_1 .sqs_message_body )
65- self .assertEqual (received_messages [1 ]["Attributes" ]["MessageGroupId" ], rsv_ravs_1 .queue_name )
66- self .assertEqual (json_loads (received_messages [2 ]["Body" ]), flu_emis_2 .sqs_message_body )
67- self .assertEqual (received_messages [2 ]["Attributes" ]["MessageGroupId" ], flu_emis_2 .queue_name )
63+ self .assertEqual (len (messages ), 3 )
64+ self .assertEqual (json_loads (messages [0 ]["Body" ]), flu_emis_1 .sqs_message_body )
65+ self .assertEqual (messages [0 ]["Attributes" ]["MessageGroupId" ], flu_emis_1 .queue_name )
66+ self .assertEqual (json_loads (messages [1 ]["Body" ]), rsv_ravs_1 .sqs_message_body )
67+ self .assertEqual (messages [1 ]["Attributes" ]["MessageGroupId" ], rsv_ravs_1 .queue_name )
68+ self .assertEqual (json_loads (messages [2 ]["Body" ]), flu_emis_2 .sqs_message_body )
69+ self .assertEqual (messages [2 ]["Attributes" ]["MessageGroupId" ], flu_emis_2 .queue_name )
6870
6971 def test_send_to_supplier_queue_failure_due_to_queue_does_not_exist (self ):
7072 """Test send_to_supplier_queue function for a failed message send due to queue not existing"""
71- with self .assertRaises (UnhandledSqsError ) as context :
72- send_to_supplier_queue (
73+
74+ with patch .dict ("os.environ" , {"QUEUE_URL" : fake_queue_url }):
75+ with patch ("send_sqs_message.sqs_client" , self .sqs_client ):
76+ with self .assertRaises (UnhandledSqsError ) as context :
77+ send_to_supplier_queue (
7378 message_body = deepcopy (FLU_EMIS_FILE_DETAILS .sqs_message_body ),
7479 vaccine_type = FLU_EMIS_FILE_DETAILS .vaccine_type ,
7580 supplier = FLU_EMIS_FILE_DETAILS .supplier ,
7681 )
77- self .assertEqual (NON_EXISTENT_QUEUE_ERROR_MESSAGE , str (context .exception ))
82+ self .assertIn ("An unexpected error occurred whilst sending to SQS" , str (context .exception ))
83+ self .assertTrue (
84+ "Queue does not exist" in str (context .exception ) or "NonExistentQueue" in str (context .exception )
85+ )
7886
7987 def test_send_to_supplier_queue_failure_due_to_absent_supplier_or_vaccine_type (self ):
8088 """Test send_to_supplier_queue function for a failed message send"""
8189 # Set up the sqs_queue
82- sqs_client .create_queue (QueueName = Sqs .QUEUE_NAME , Attributes = Sqs .ATTRIBUTES )
90+ self . sqs_client .create_queue (QueueName = Sqs .QUEUE_NAME , Attributes = Sqs .ATTRIBUTES )
8391 expected_error_message = (
8492 "Message not sent to supplier queue as unable to identify supplier and/ or vaccine type"
8593 )
@@ -100,33 +108,36 @@ def test_send_to_supplier_queue_failure_due_to_absent_supplier_or_vaccine_type(s
100108 def test_make_and_send_sqs_message_success (self ):
101109 """Test make_and_send_sqs_message function for a successful message send"""
102110 # Create a mock SQS queue
103- queue_url = sqs_client .create_queue (QueueName = Sqs .QUEUE_NAME , Attributes = Sqs .ATTRIBUTES )["QueueUrl" ]
111+ queue_url = self . sqs_client .create_queue (QueueName = Sqs .QUEUE_NAME , Attributes = Sqs .ATTRIBUTES )["QueueUrl" ]
104112
105113 # Call the send_to_supplier_queue function
106- self .assertIsNone (
107- make_and_send_sqs_message (
108- file_key = FLU_EMIS_FILE_DETAILS .file_key ,
109- message_id = FLU_EMIS_FILE_DETAILS .message_id ,
110- permission = deepcopy (FLU_EMIS_FILE_DETAILS .permissions_list ),
111- vaccine_type = FLU_EMIS_FILE_DETAILS .vaccine_type ,
112- supplier = FLU_EMIS_FILE_DETAILS .supplier ,
113- created_at_formatted_string = FLU_EMIS_FILE_DETAILS .created_at_formatted_string ,
114- )
114+ with patch .dict ("os.environ" , {"QUEUE_URL" : queue_url }):
115+ with patch ("send_sqs_message.sqs_client" , self .sqs_client ):
116+ self .assertIsNone (
117+ make_and_send_sqs_message (
118+ file_key = FLU_EMIS_FILE_DETAILS .file_key ,
119+ message_id = FLU_EMIS_FILE_DETAILS .message_id ,
120+ permission = deepcopy (FLU_EMIS_FILE_DETAILS .permissions_list ),
121+ vaccine_type = FLU_EMIS_FILE_DETAILS .vaccine_type ,
122+ supplier = FLU_EMIS_FILE_DETAILS .supplier ,
123+ created_at_formatted_string = FLU_EMIS_FILE_DETAILS .created_at_formatted_string ,
124+ )
115125 )
116-
117- # Assert that correct message has reached the queue
118- messages = sqs_client .receive_message (QueueUrl = queue_url , MaxNumberOfMessages = 1 )
119- self .assertEqual (json_loads (messages ["Messages" ][0 ]["Body" ]), deepcopy (FLU_EMIS_FILE_DETAILS .sqs_message_body ))
126+ # Assert that correct message has reached the queue
127+ messages = self .sqs_client .receive_message (QueueUrl = queue_url , MaxNumberOfMessages = 1 )
128+ self .assertEqual (json_loads (messages ["Messages" ][0 ]["Body" ]), deepcopy (FLU_EMIS_FILE_DETAILS .sqs_message_body ))
120129
121130 def test_make_and_send_sqs_message_failure (self ):
122- """Test make_and_send_sqs_message function for a failure due to queue not existing"""
123- with self .assertRaises (UnhandledSqsError ) as context :
124- make_and_send_sqs_message (
125- file_key = FLU_EMIS_FILE_DETAILS .file_key ,
126- message_id = FLU_EMIS_FILE_DETAILS .message_id ,
127- permission = deepcopy (FLU_EMIS_FILE_DETAILS .permissions_list ),
128- vaccine_type = FLU_EMIS_FILE_DETAILS .vaccine_type ,
129- supplier = FLU_EMIS_FILE_DETAILS .supplier ,
130- created_at_formatted_string = FLU_EMIS_FILE_DETAILS .created_at_formatted_string ,
131- )
131+
132+ with patch .dict ("os.environ" , {"QUEUE_URL" : fake_queue_url }):
133+ with patch ("send_sqs_message.sqs_client" , boto3 .client ("sqs" , region_name = REGION_NAME )):
134+ with self .assertRaises (UnhandledSqsError ) as context :
135+ make_and_send_sqs_message (
136+ file_key = FLU_EMIS_FILE_DETAILS .file_key ,
137+ message_id = FLU_EMIS_FILE_DETAILS .message_id ,
138+ permission = deepcopy (FLU_EMIS_FILE_DETAILS .permissions_list ),
139+ vaccine_type = FLU_EMIS_FILE_DETAILS .vaccine_type ,
140+ supplier = FLU_EMIS_FILE_DETAILS .supplier ,
141+ created_at_formatted_string = FLU_EMIS_FILE_DETAILS .created_at_formatted_string ,
142+ )
132143 self .assertIn (NON_EXISTENT_QUEUE_ERROR_MESSAGE , str (context .exception ))
0 commit comments