"""Test SQS utility functions.""" from unittest import mock import pytest from accounting.util import sqs def test_get_sqs_resources(mocker): """Test SQS resource helper.""" mocked_sqs = mocker.Mock() mocked_resource = mocker.patch('boto3.resource') mocked_resource.return_value = mocked_sqs assert sqs.get_sqs_resources() == mocked_sqs @pytest.mark.parametrize('queue_name', ['test_queue', 'another_queue']) def test_get_queue_by_name(mocker, queue_name): """Test that get_queue_by_name function uses provided args.""" mocked_sqs = mocker.Mock() mocked_get_sqs_resources = mocker.patch( 'accounting.util.sqs.get_sqs_resources') mocked_get_sqs_resources.return_value = mocked_sqs assert sqs.get_queue_by_name(queue_name) mocked_sqs.get_queue_by_name.assert_called_with( QueueName=queue_name) # Ensure that appropriate sqs_resource is being used. mocked_sqs_defined = mocker.Mock() mocked_get_sqs_resources = mocker.patch( 'accounting.util.sqs.get_sqs_resources') mocked_get_sqs_resources.return_value = mocked_sqs_defined sqs.get_queue_by_name(queue_name, sqs_resource=mocked_sqs_defined) mocked_get_sqs_resources.assert_not_called() mocked_sqs_defined.get_queue_by_name.assert_called_with( QueueName=queue_name) def test_get_queue_number_of_messages(mocker): """Test that get_queue_number_of_messages uses attributes property.""" expected_message_count = 42 mocked_attributes = {'ApproximateNumberOfMessages': expected_message_count} mocked_queue = mocker.Mock(attributes=mocked_attributes) actual_number = sqs.get_queue_number_of_messages(mocked_queue) assert actual_number == expected_message_count mocked_queue.reload.assert_any_call() @pytest.mark.parametrize('src_list, expected, sublist_size', [ ([], [], 10), ([1, 2, 3], [[1, 2, 3]], 3), (list(range(6)), [[0, 1], [2, 3], [4, 5]], 2), (list(range(6)), [[0, 1, 2, 3], [4, 5]], 4), ]) def test_yield_sublists_divisible(src_list, expected, sublist_size): """Test yield_sublists function.""" res = sqs.yield_sublists(src_list, sublist_size) res = list(res) assert len(res) == len(expected) assert res == expected @pytest.mark.parametrize('messages, expected_message', [ ([], None), (['message'], 'message') ]) def test_get_message(messages, expected_message): """Test get_message utility funciton.""" queue = mock.MagicMock() queue.receive_messages.return_value = messages result = sqs.get_message(queue) assert result == expected_message queue.reload.assert_called_once() queue.receive_messages.assert_called_with( MaxNumberOfMessages=1, WaitTimeSeconds=20, AttributeNames=['All'])