"""Tests for SQS util functions.""" from unittest.mock import MagicMock import boto3 from feed_sender.util.aws import sqs queue_counter = 0 delete_counter = 0 QUEUE_CAPACITY = 18 def reset_queue_counter(): """Reset global queue counter.""" global queue_counter global delete_counter queue_counter = 0 delete_counter = 0 def increment_delete(): """Reset global delete counter.""" global delete_counter delete_counter = delete_counter + 1 def poll_dummy_queue(MaxNumberOfMessages, WaitTimeSeconds): """Generate test messages.""" messages = [] global queue_counter for count in range(1, MaxNumberOfMessages + 1): if queue_counter < QUEUE_CAPACITY: queue_counter += 1 new_message = MagicMock() new_message.body = 'Test Message: {} - Batch count: {}'.format( queue_counter, count) new_message.delete = increment_delete messages.append(new_message) return messages def poll_empty_queue(MaxNumberOfMessages, WaitTimeSeconds): """Generate test messages.""" return [] def test_get_messages(): """Test sqs.get_messages.""" mock_queue = MagicMock() mock_queue.receive_messages = poll_dummy_queue mock_queue.set_attributes = MagicMock(return_value=True) mock_queue.reload = MagicMock(return_value=True) mock_queue.attributes = {'ApproximateNumberOfMessages': 5} mock_sqs = MagicMock() mock_sqs.get_queue_by_name = MagicMock(return_value=mock_queue) # mock boto3.resource boto3.resource = MagicMock(return_value=mock_sqs) reset_queue_counter() messages = sqs.get_messages('temp', 5) actual_text = [] for message in messages: actual_text.append(message.body) expected_text = [ 'Test Message: 1 - Batch count: 1', 'Test Message: 2 - Batch count: 2', 'Test Message: 3 - Batch count: 3', 'Test Message: 4 - Batch count: 4', 'Test Message: 5 - Batch count: 5' ] assert len(messages) == 5 assert expected_text == actual_text assert not mock_queue.set_attributes.called def test_get_messages_more_than_ten(): """Test sqs.get_messages.""" mock_queue = MagicMock() mock_queue.receive_messages = poll_dummy_queue mock_queue.set_attributes = MagicMock(return_value=True) mock_queue.reload = MagicMock(return_value=True) mock_queue.attributes = {'ApproximateNumberOfMessages': 15} mock_sqs = MagicMock() mock_sqs.get_queue_by_name = MagicMock(return_value=mock_queue) # mock boto3.resource boto3.resource = MagicMock(return_value=mock_sqs) reset_queue_counter() messages = sqs.get_messages('temp', 15) actual_text = [] for message in messages: actual_text.append(message.body) expected_text = [ 'Test Message: 1 - Batch count: 1', 'Test Message: 2 - Batch count: 2', 'Test Message: 3 - Batch count: 3', 'Test Message: 4 - Batch count: 4', 'Test Message: 5 - Batch count: 5', 'Test Message: 6 - Batch count: 6', 'Test Message: 7 - Batch count: 7', 'Test Message: 8 - Batch count: 8', 'Test Message: 9 - Batch count: 9', 'Test Message: 10 - Batch count: 10', 'Test Message: 11 - Batch count: 1', 'Test Message: 12 - Batch count: 2', 'Test Message: 13 - Batch count: 3', 'Test Message: 14 - Batch count: 4', 'Test Message: 15 - Batch count: 5' ] assert len(messages) == 15 assert expected_text == actual_text assert not mock_queue.set_attributes.called def test_get_messages_no_max(): """Test sqs.get_messages.""" mock_queue = MagicMock() mock_queue.receive_messages = poll_dummy_queue mock_queue.set_attributes = MagicMock(return_value=True) mock_queue.reload = MagicMock(return_value=True) mock_queue.attributes = {'ApproximateNumberOfMessages': QUEUE_CAPACITY} mock_sqs = MagicMock() mock_sqs.get_queue_by_name = MagicMock(return_value=mock_queue) # mock boto3.resource boto3.resource = MagicMock(return_value=mock_sqs) reset_queue_counter() messages = sqs.get_messages('temp') actual_text = [] for message in messages: actual_text.append(message.body) expected_text = [ 'Test Message: 1 - Batch count: 1', 'Test Message: 2 - Batch count: 2', 'Test Message: 3 - Batch count: 3', 'Test Message: 4 - Batch count: 4', 'Test Message: 5 - Batch count: 5', 'Test Message: 6 - Batch count: 6', 'Test Message: 7 - Batch count: 7', 'Test Message: 8 - Batch count: 8', 'Test Message: 9 - Batch count: 9', 'Test Message: 10 - Batch count: 10', 'Test Message: 11 - Batch count: 1', 'Test Message: 12 - Batch count: 2', 'Test Message: 13 - Batch count: 3', 'Test Message: 14 - Batch count: 4', 'Test Message: 15 - Batch count: 5', 'Test Message: 16 - Batch count: 6', 'Test Message: 17 - Batch count: 7', 'Test Message: 18 - Batch count: 8' ] assert len(messages) == QUEUE_CAPACITY assert expected_text == actual_text assert not mock_queue.set_attributes.called def test_get_messages_set_visibility(): """Test sqs.get_messages.""" mock_queue = MagicMock() mock_queue.receive_messages = poll_dummy_queue mock_queue.set_attributes = MagicMock(return_value=True) mock_queue.reload = MagicMock(return_value=True) mock_queue.attributes = {'ApproximateNumberOfMessages': 5} mock_sqs = MagicMock() mock_sqs.get_queue_by_name = MagicMock(return_value=mock_queue) # mock boto3.resource boto3.resource = MagicMock(return_value=mock_sqs) reset_queue_counter() messages = sqs.get_messages('temp', 5, 500) actual_text = [] for message in messages: actual_text.append(message.body) expected_text = [ 'Test Message: 1 - Batch count: 1', 'Test Message: 2 - Batch count: 2', 'Test Message: 3 - Batch count: 3', 'Test Message: 4 - Batch count: 4', 'Test Message: 5 - Batch count: 5' ] assert len(messages) == 5 assert expected_text == actual_text assert mock_queue.set_attributes.called def test_get_messages_empty(): """Test sqs.get_messages.""" mock_queue = MagicMock() mock_queue.receive_messages = MagicMock(side_effect=poll_empty_queue) mock_queue.set_attributes = MagicMock(return_value=True) mock_queue.reload = MagicMock(return_value=True) mock_queue.attributes = {'ApproximateNumberOfMessages': 0} mock_sqs = MagicMock() mock_sqs.get_queue_by_name = MagicMock(return_value=mock_queue) # mock boto3.resource boto3.resource = MagicMock(return_value=mock_sqs) reset_queue_counter() messages = sqs.get_messages('temp') actual_text = [] for message in messages: actual_text.append(message.body) expected_text = [] assert len(messages) == 0 assert expected_text == actual_text assert not mock_queue.receive_messages.called assert not mock_queue.set_attributes.called def test_delete_messages(): """Test sqs.get_messages.""" mock_queue = MagicMock() mock_queue.receive_messages = poll_dummy_queue mock_queue.set_attributes = MagicMock(return_value=True) mock_queue.reload = MagicMock(return_value=True) mock_queue.attributes = {'ApproximateNumberOfMessages': QUEUE_CAPACITY} mock_sqs = MagicMock() mock_sqs.get_queue_by_name = MagicMock(return_value=mock_queue) # mock boto3.resource boto3.resource = MagicMock(return_value=mock_sqs) reset_queue_counter() messages = sqs.get_messages('test') sqs.delete_messages(messages) assert len(messages) == delete_counter