"""Tests for the SQS connector.""" from unittest.mock import MagicMock from unittest.mock import patch import pytest from moneyhub.connectors import sqs @patch('moneyhub.connectors.sqs.resource') def test_send_message(mock_resource): """Test sending a message to the queue.""" queue_name = 'my_queue' response = {'success': 'yes'} mock_queue = MagicMock() mock_resource('sqs').get_queue_by_name.return_value = mock_queue mock_queue.send_message.return_value = response sqs.send_message( queue_name, 'correlation_id', {'account_id': '123', 'statement_period_id': '456'}) mock_resource('sqs').get_queue_by_name.assert_called_once_with( QueueName=queue_name) mock_queue.send_message.assert_called_once_with( MessageBody=( '{"Correlation-Id": "correlation_id.1", ' '"account_id": "123", ' '"statement_period_id": "456"}' ) ) @patch('moneyhub.connectors.sqs.resource') def test_send_message_no_correlation_id(mock_resource): """Test sending a message to the queue without a correlation ID.""" queue_name = 'my_queue' response = {'success': 'yes'} mock_queue = MagicMock() mock_resource('sqs').get_queue_by_name.return_value = mock_queue mock_queue.send_message.return_value = response sqs.send_message( queue_name, None, {'account_id': '123', 'statement_period_id': '456'}) mock_resource('sqs').get_queue_by_name.assert_called_once_with( QueueName=queue_name) mock_queue.send_message.assert_called_once_with( MessageBody=( '{"account_id": "123", "statement_period_id": "456"}' ) ) @patch('moneyhub.connectors.sqs.resource') def test_send_messages(mock_resource): """Test sending several messages to the queue.""" queue_name = 'my_queue' messages = [ {'account_id': '111', 'statement_period_id': '456'}, {'account_id': '222', 'statement_period_id': '654'}, {'account_id': '333', 'statement_period_id': '456'}, {'account_id': '444', 'statement_period_id': '654'}, ] mock_queue = MagicMock() mock_resource('sqs').get_queue_by_name.return_value = mock_queue mock_queue.send_messages.return_value = {'Successful': messages} sqs.send_messages( queue_name, 'correlation_id', messages) mock_resource('sqs').get_queue_by_name.assert_called_once_with( QueueName=queue_name) mock_queue.send_messages.assert_called_once_with( Entries=[ { 'Id': '1', 'MessageBody': ( '{"Correlation-Id": "correlation_id.1", ' '"account_id": "111", ' '"statement_period_id": "456"}' ), }, { 'Id': '2', 'MessageBody': ( '{"Correlation-Id": "correlation_id.1", ' '"account_id": "222", ' '"statement_period_id": "654"}' ), }, { 'Id': '3', 'MessageBody': ( '{"Correlation-Id": "correlation_id.1", ' '"account_id": "333", ' '"statement_period_id": "456"}' ), }, { 'Id': '4', 'MessageBody': ( '{"Correlation-Id": "correlation_id.1", ' '"account_id": "444", ' '"statement_period_id": "654"}' ), }, ] ) @patch('moneyhub.connectors.sqs.resource') def test_send_messages_no_correlation_id(mock_resource): """Test sending several messages to the queue without a correlation ID.""" queue_name = 'my_queue' messages = [ {'account_id': '111', 'statement_period_id': '456'}, {'account_id': '222', 'statement_period_id': '654'}, {'account_id': '333', 'statement_period_id': '456'}, {'account_id': '444', 'statement_period_id': '654'}, ] mock_queue = MagicMock() mock_resource('sqs').get_queue_by_name.return_value = mock_queue mock_queue.send_messages.return_value = {'Successful': messages} sqs.send_messages( queue_name, None, messages) mock_resource('sqs').get_queue_by_name.assert_called_once_with( QueueName=queue_name) mock_queue.send_messages.assert_called_once_with( Entries=[ { 'Id': '1', 'MessageBody': ( '{"account_id": "111", "statement_period_id": "456"}' ), }, { 'Id': '2', 'MessageBody': ( '{"account_id": "222", "statement_period_id": "654"}' ), }, { 'Id': '3', 'MessageBody': ( '{"account_id": "333", "statement_period_id": "456"}' ), }, { 'Id': '4', 'MessageBody': ( '{"account_id": "444", "statement_period_id": "654"}' ), }, ] ) @patch('moneyhub.connectors.sqs.resource') def test_send_messages_with_failures(mock_resource): """Test sending several messages to the queue with some failing.""" queue_name = 'my_queue' messages = [ {'account_id': '111', 'statement_period_id': '456'}, {'account_id': '222', 'statement_period_id': '654'}, {'account_id': '333', 'statement_period_id': '456'}, {'account_id': '444', 'statement_period_id': '654'}, ] mock_queue = MagicMock() mock_resource('sqs').get_queue_by_name.return_value = mock_queue mock_queue.send_messages.return_value = { 'Successful': [messages[0], messages[3]], 'Failed': [ {'Message': 'Failure one'}, {'Message': 'Failure two'}, ], } with pytest.raises(Exception) as exc: sqs.send_messages( queue_name, 'correlation_id', messages) assert str(exc.value) == 'Failed to send 2 (of 4) SQS messages:\nFailure one\nFailure two'