Coverage for tests/test_blog_sitemap.py: 100%

43 statements  

« prev     ^ index     » next       coverage.py v7.16.2, created at 2026-10-25 22:09 +0000

1import unittest 

2from unittest.mock import patch 

3 

4from requests.exceptions import ProxyError 

5 

6from webapp.app import create_app 

7 

8 

9class FakeResponse: 

10 def __init__(self, status_code=200, posts=None, broken_json=False): 

11 self.status_code = status_code 

12 self._posts = posts or [] 

13 self._broken_json = broken_json 

14 

15 def json(self): 

16 if self._broken_json or self.status_code != 200: 

17 raise ValueError("invalid json") 

18 return self._posts 

19 

20 

21class TestBlogSitemap(unittest.TestCase): 

22 def setUp(self): 

23 self.app = create_app(testing=True) 

24 self.client = self.app.test_client() 

25 

26 @patch("webapp.blog.views.requests.Session.get") 

27 def test_sitemap_handles_request_error(self, mock_get): 

28 mock_get.side_effect = ProxyError("Unable to connect to proxy") 

29 

30 response = self.client.get("/blog/sitemap.xml") 

31 

32 self.assertEqual(response.status_code, 200) 

33 self.assertIn(b"<urlset", response.data) 

34 

35 @patch("webapp.blog.views.requests.Session.get") 

36 def test_sitemap_handles_invalid_json(self, mock_get): 

37 mock_get.return_value = FakeResponse(broken_json=True) 

38 

39 response = self.client.get("/blog/sitemap.xml") 

40 

41 self.assertEqual(response.status_code, 200) 

42 self.assertIn(b"<urlset", response.data) 

43 

44 @patch("webapp.blog.views.requests.Session.get") 

45 def test_sitemap_handles_http_error_status(self, mock_get): 

46 mock_get.return_value = FakeResponse(status_code=502) 

47 

48 response = self.client.get("/blog/sitemap.xml") 

49 

50 self.assertEqual(response.status_code, 200) 

51 self.assertIn(b"<urlset", response.data) 

52 

53 @patch("webapp.blog.views.requests.Session.get") 

54 def test_sitemap_lists_posts(self, mock_get): 

55 posts = [ 

56 { 

57 "slug": "some-post", 

58 "date": "2026-10-01T00:00:00+00:00", 

59 } 

60 ] 

61 mock_get.side_effect = [ 

62 FakeResponse(status_code=200, posts=posts), 

63 FakeResponse(status_code=400), 

64 ] 

65 

66 response = self.client.get("/blog/sitemap.xml") 

67 

68 self.assertEqual(response.status_code, 200) 

69 self.assertIn(b"some-post", response.data) 

70 self.assertEqual(mock_get.call_count, 2)