from django.test import RequestFactory, SimpleTestCase from django.urls import resolve, reverse from unittest.mock import patch from .. import views class PublishRouteTests(SimpleTestCase): def setUp(self): self.factory = RequestFactory() def test_publish_url_resolves_to_publish_view(self): match = resolve("/task/publish_42/") self.assertEqual(match.func, views.publish) self.assertEqual(match.kwargs, {"id": 42}) def test_publish_url_reverse(self): url = reverse("publish", args=[7]) self.assertEqual(url, "/task/publish_7/") @patch("fetcher.views.Publisher") def test_publish_invokes_publisher(self, mock_publisher_cls): mock_instance = mock_publisher_cls.return_value mock_instance.publish.return_value = None request = self.factory.get("/task/publish_9/") response = views.publish(request, 9) self.assertEqual(response.status_code, 200) mock_publisher_cls.assert_called_once_with() mock_instance.publish.assert_called_once_with(9) self.assertIn(b"9", response.content) @patch("fetcher.views.Publisher") def test_publish_reports_error_gracefully(self, mock_publisher_cls): mock_instance = mock_publisher_cls.return_value mock_instance.publish.side_effect = RuntimeError("boom") request = self.factory.get("/task/publish_3/") response = views.publish(request, 3) self.assertEqual(response.status_code, 200) self.assertIn(b"Error publishing", response.content) mock_instance.publish.assert_called_once_with(3)