def test_receive_when_target_not_in_post_data(test_source):
    request = Mock()
    request.method = "POST"
    request.POST = {"source": test_source}

    response = receive(request)

    assert isinstance(response, HttpResponseBadRequest)
def test_receive_when_target_does_not_resolve(mock_url_resolves, test_source,
                                              test_target):
    request = Mock()
    request.method = "POST"
    request.POST = {"source": test_source, "target": test_target}

    mock_url_resolves.return_value = False
    response = receive(request)

    mock_url_resolves.assert_called_once_with(test_target)
    assert isinstance(response, HttpResponseBadRequest)
def test_receive_when_general_exception_occurs(mock_url_resolves,
                                               mock_fetch_and_validate_source,
                                               test_source, test_target):
    request = Mock()
    request.method = "POST"
    request.POST = {"source": test_source, "target": test_target}

    mock_url_resolves.return_value = True
    mock_fetch_and_validate_source.side_effect = Exception
    response = receive(request)

    mock_fetch_and_validate_source.assert_called_once_with(
        test_source, test_target)
    mock_url_resolves.assert_called_once_with(test_target)
    assert isinstance(response, HttpResponseServerError)
def test_receive_when_source_does_not_contain_target(
        mock_url_resolves, mock_fetch_and_validate_source, mock_invalidate,
        test_source, test_target):
    request = Mock()
    request.method = "POST"
    request.POST = {"source": test_source, "target": test_target}

    mock_url_resolves.return_value = True
    mock_fetch_and_validate_source.side_effect = TargetNotFoundError
    response = receive(request)

    mock_fetch_and_validate_source.assert_called_once_with(
        test_source, test_target)
    mock_url_resolves.assert_called_once_with(test_target)
    assert mock_invalidate.call_count == 1
    assert isinstance(response, HttpResponseBadRequest)
def test_receive_happy_path(mock_url_resolves, mock_fetch_and_validate_source,
                            mock_update, test_source, test_target):
    request = Mock()
    request.method = "POST"
    request.POST = {"source": test_source, "target": test_target}

    mock_url_resolves.return_value = True
    mock_fetch_and_validate_source.return_value = "foo"
    response = receive(request)

    mock_fetch_and_validate_source.assert_called_once_with(
        test_source, test_target)
    mock_update.assert_called_once_with(
        test_source, test_target, mock_fetch_and_validate_source.return_value)
    mock_url_resolves.assert_called_once_with(test_target)
    assert isinstance(response, HttpResponse)