/ tests / test_views.py
test_views.py
  1  from unittest.mock import Mock, patch
  2  
  3  import pytest
  4  
  5  from django.http import HttpResponseBadRequest, HttpResponse, HttpResponseServerError
  6  
  7  from webmention.views import receive
  8  from webmention.resolution import SourceFetchError, TargetNotFoundError
  9  
 10  
 11  def test_receive_when_source_not_in_post_data(test_target):
 12      request = Mock()
 13      request.method = "POST"
 14      request.POST = {"target": test_target}
 15  
 16      response = receive(request)
 17  
 18      assert isinstance(response, HttpResponseBadRequest)
 19  
 20  
 21  def test_receive_when_target_not_in_post_data(test_source):
 22      request = Mock()
 23      request.method = "POST"
 24      request.POST = {"source": test_source}
 25  
 26      response = receive(request)
 27  
 28      assert isinstance(response, HttpResponseBadRequest)
 29  
 30  
 31  @patch("webmention.views.url_resolves")
 32  def test_receive_when_target_does_not_resolve(mock_url_resolves, test_source, test_target):
 33      request = Mock()
 34      request.method = "POST"
 35      request.POST = {"source": test_source, "target": test_target}
 36  
 37      mock_url_resolves.return_value = False
 38      response = receive(request)
 39  
 40      mock_url_resolves.assert_called_once_with(test_target)
 41      assert isinstance(response, HttpResponseBadRequest)
 42  
 43  
 44  @pytest.mark.django_db
 45  @patch("webmention.views.WebMentionResponse.update")
 46  @patch("webmention.views.fetch_and_validate_source")
 47  @patch("webmention.views.url_resolves")
 48  def test_receive_happy_path(mock_url_resolves, mock_fetch_and_validate_source, mock_update, test_source, test_target):
 49      request = Mock()
 50      request.method = "POST"
 51      request.POST = {"source": test_source, "target": test_target}
 52  
 53      mock_url_resolves.return_value = True
 54      mock_fetch_and_validate_source.return_value = "foo"
 55      response = receive(request)
 56  
 57      mock_fetch_and_validate_source.assert_called_once_with(test_source, test_target)
 58      mock_update.assert_called_once_with(test_source, test_target, mock_fetch_and_validate_source.return_value)
 59      mock_url_resolves.assert_called_once_with(test_target)
 60      assert isinstance(response, HttpResponse)
 61  
 62  
 63  @pytest.mark.django_db
 64  @patch("webmention.views.WebMentionResponse.invalidate")
 65  @patch("webmention.views.fetch_and_validate_source")
 66  @patch("webmention.views.url_resolves")
 67  def test_receive_when_source_unavailable(
 68      mock_url_resolves, mock_fetch_and_validate_source, mock_invalidate, test_source, test_target
 69  ):
 70      request = Mock()
 71      request.method = "POST"
 72      request.POST = {"source": test_source, "target": test_target}
 73  
 74      mock_url_resolves.return_value = True
 75      mock_fetch_and_validate_source.side_effect = SourceFetchError
 76      response = receive(request)
 77  
 78      mock_fetch_and_validate_source.assert_called_once_with(test_source, test_target)
 79      mock_url_resolves.assert_called_once_with(test_target)
 80      assert mock_invalidate.call_count == 1
 81      assert isinstance(response, HttpResponseBadRequest)
 82  
 83  
 84  @pytest.mark.django_db
 85  @patch("webmention.views.WebMentionResponse.invalidate")
 86  @patch("webmention.views.fetch_and_validate_source")
 87  @patch("webmention.views.url_resolves")
 88  def test_receive_when_source_does_not_contain_target(
 89      mock_url_resolves, mock_fetch_and_validate_source, mock_invalidate, test_source, test_target
 90  ):
 91      request = Mock()
 92      request.method = "POST"
 93      request.POST = {"source": test_source, "target": test_target}
 94  
 95      mock_url_resolves.return_value = True
 96      mock_fetch_and_validate_source.side_effect = TargetNotFoundError
 97      response = receive(request)
 98  
 99      mock_fetch_and_validate_source.assert_called_once_with(test_source, test_target)
100      mock_url_resolves.assert_called_once_with(test_target)
101      assert mock_invalidate.call_count == 1
102      assert isinstance(response, HttpResponseBadRequest)
103  
104  
105  @pytest.mark.django_db
106  @patch("webmention.views.fetch_and_validate_source")
107  @patch("webmention.views.url_resolves")
108  def test_receive_when_general_exception_occurs(
109      mock_url_resolves, mock_fetch_and_validate_source, test_source, test_target
110  ):
111      request = Mock()
112      request.method = "POST"
113      request.POST = {"source": test_source, "target": test_target}
114  
115      mock_url_resolves.return_value = True
116      mock_fetch_and_validate_source.side_effect = Exception
117      response = receive(request)
118  
119      mock_fetch_and_validate_source.assert_called_once_with(test_source, test_target)
120      mock_url_resolves.assert_called_once_with(test_target)
121      assert isinstance(response, HttpResponseServerError)