def test_process_function_logs_error(mock_loop, mock_resource, mock_log, mock_get_task):
    "test ..."
    # Arrange
    Q = QueueProcessor(run=False)

    fake_task_name = fake.pystr()
    fake_params = fake.pylist()

    fake_message = {
        'task': fake_task_name,
        'parameters': fake_params
    }
    mock_task = MagicMock()
    def raise_exception(*args, **kwargs):
        raise Exception()
    mock_task.side_effect = raise_exception
    mock_get_task.return_value = mock_task

    # Act
    Q.process(fake_message)

    # Assert
    mock_get_task.assert_called_once_with(fake_task_name)
    mock_log.exception.assert_called()
    mock_task.assert_called_once_with(Q, *fake_params)
def test_task_decorator_registers_task():
    "test ..."
    # Arrange
    mock_task = MagicMock()
    mock_task_name = fake.pystr()

    # Act
    QueueProcessor.task(mock_task_name)(mock_task)

    # Assert
    assert_equal(QueueProcessor._tasks[mock_task_name], mock_task)
def test_get_task_returns_task(mock_loop, mock_resource):
    "test ..."
    # Arrange
    mock_task = MagicMock()
    mock_task_name = fake.pystr()
    QueueProcessor._tasks[mock_task_name] = mock_task
    Q = QueueProcessor(run=False)

    # Act
    actual_task = Q._get_task(mock_task_name)

    # Assert
    assert_equal(actual_task, mock_task)
def test_poll_polls_sqs_no_messages_does_nothing(mock_loop, mock_resource):
    "test ..."
    # Arrange
    mock_sqs = MagicMock()
    mock_queue = MagicMock()
    mock_sqs.get_queue_by_name.return_value = mock_queue
    mock_resource.return_value = mock_sqs

    Q = QueueProcessor(run=False)
    Q.process = MagicMock()

    # Act
    Q.poll().__next__()

    # Assert
    mock_queue.receive_messages.assert_called()
def test_check_environment_raises(mock_loop, mock_resource, mock_get_task):
    "test ..."
    # Arrange
    del os.environ['QUEUE_NAME']

    # Act/Assert
    with assert_raises(SystemExit):
        QueueProcessor(run=False)
def test_process_invokes_function(mock_loop, mock_resource, mock_get_task):
    "test ..."
    # Arrange
    Q = QueueProcessor(run=False)

    fake_task_name = fake.pystr()
    fake_params = fake.pylist()

    fake_message = {
        'task': fake_task_name,
        'parameters': fake_params
    }
    mock_task = MagicMock()
    mock_get_task.return_value = mock_task

    # Act
    Q.process(fake_message)

    # Assert
    mock_get_task.assert_called_once_with(fake_task_name)
    mock_task.assert_called_once_with(Q, *fake_params)
def test_poll_polls_sqs_messages_deletes_messages(mock_loop, mock_resource):
    "test ..."
    # Arrange
    mock_sqs = MagicMock()
    mock_queue = MagicMock()
    mock_sqs.get_queue_by_name.return_value = mock_queue
    mock_resource.return_value = mock_sqs

    mock_process = MagicMock()

    def generate_message():
        message = {
            'task': fake.pystr(),
            'params': fake.pylist(10, False, int, str)
        }
        return message

    fake_bodies = []
    fake_messages = fake.pylist(10, False, MagicMock)
    for f in fake_messages:
        # TODO: need to make this have a task name and params that are mocks
        body = generate_message()
        f.body = json.dumps(body)
        fake_bodies.append(body)
    mock_queue.receive_messages.return_value = fake_messages

    Q = QueueProcessor(run=False)
    Q.process = mock_process

    # Act
    Q.poll().__next__()

    # Assert
    mock_queue.receive_messages.assert_called()
    for f in fake_bodies:
        mock_process.assert_any_call(f)