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)