import boto from boto.sqs.message import Message import json from moto import mock_sqs import pytest from unittest.mock import Mock, sentinel from fpcapture.connectors import sentry from fpcapture.logic import queue as queue_logic from fpcapture.logic import codegen TEST_QUEUE_NAME = 'test-fp-capture' TEST_TUID = 1234 TEST_UPC = 123456123456 TEST_FILENAME = '//10.10.1.2/path/to/audio.wav' TEST_UPLOAD_TIME = 1450204642 TEST_CORRELATION_ID = '1234-1450204642' TEST_TRACK_SOURCE = 'direct_delivery' @pytest.fixture def valid_message(): return Message(body=json.dumps(valid_payload())) @pytest.fixture def valid_payload(): return { 'upc': TEST_UPC, 'tuid': TEST_TUID, 'filename': TEST_FILENAME, 'file_upload_time': TEST_UPLOAD_TIME, 'correlation_id': TEST_CORRELATION_ID, 'track_source': TEST_TRACK_SOURCE} @mock_sqs def test_poll_queue_acks_on_success(monkeypatch, valid_message): sqs_conn = boto.connect_sqs() queue = sqs_conn.create_queue(TEST_QUEUE_NAME) queue.set_timeout(0) queue.write(valid_message) mock_encode = Mock(return_value=True) monkeypatch.setattr(codegen, 'encode', mock_encode) db_session = sentinel.db_session queue_logic.poll_queue( queue=queue, db_session=db_session, visibility_timeout=0, wait_time_seconds=0) assert len(queue.get_messages()) == 0 def test_poll_in_loop(monkeypatch): is_expired = Mock(side_effect=[False, False, True]) timer = Mock(is_expired=is_expired) poll_queue = Mock() monkeypatch.setattr(queue_logic, 'poll_queue', poll_queue) queue = sentinel.queue db_session = sentinel.db_session num_messages = 10 visibility_timeout = 120 wait_time_seconds = 20 queue_logic.poll_in_loop( queue=queue, db_session=db_session, timer=timer, num_messages=num_messages, visibility_timeout=visibility_timeout, wait_time_seconds=wait_time_seconds) poll_queue.assert_called_with( queue=queue, db_session=db_session, num_messages=num_messages, visibility_timeout=visibility_timeout, wait_time_seconds=wait_time_seconds) assert len(poll_queue.call_args_list) == 2 def test_process_message_invalid_message(monkeypatch): """Test that exceptions from invalid messages are passed to Sentry """ invalid_message = Message(body='not JSON') monkeypatch.setattr(codegen, 'encode', Mock(return_value=True)) mock_capture = Mock() monkeypatch.setattr(sentry.sentry_client, 'captureException', mock_capture) queue_logic.process_message(invalid_message, sentinel.db_session) assert len(mock_capture.call_args_list) == 1