Coverage for tests/tests_feeds.py: 91%

34 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-10-14 22:07 +0000

1import unittest 

2import xml.etree.ElementTree as ET 

3from unittest.mock import patch, Mock 

4from webapp.app import create_app 

5 

6 

7class TestFeeds(unittest.TestCase): 

8 def setUp(self): 

9 self.app = create_app(testing=True) 

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

11 

12 @patch("webapp.feeds.feeds.session.get") 

13 def test_feeds_updates_success(self, mock_get): 

14 """Test successful RSS feed generation using feedgen""" 

15 mock_response = Mock() 

16 mock_response.json.return_value = { 

17 "page": 1, 

18 "size": 2, 

19 "snaps": [ 

20 { 

21 "name": "test-snap", 

22 "title": "Test Snap", 

23 "summary": "A test snap", 

24 "publisher": "Test Publisher", 

25 "license": "MIT", 

26 "version": "1.0.0", 

27 "last_updated": "Thu, 02 Oct 2025 22:07:58 GMT", 

28 "icon": "https://example.com/icon.png", 

29 "snap_id": "test-snap-id-123", 

30 "media": [ 

31 { 

32 "type": "screenshot", 

33 "url": "https://example.com/screenshot.png", 

34 } 

35 ], 

36 } 

37 ], 

38 } 

39 mock_response.raise_for_status.return_value = None 

40 mock_get.return_value = mock_response 

41 

42 response = self.client.get("/feeds/updates") 

43 self.assertEqual(response.status_code, 200) 

44 self.assertEqual( 

45 response.content_type, "application/rss+xml; charset=utf-8" 

46 ) 

47 content = response.get_data(as_text=True) 

48 self.assertIn("<?xml version='1.0' encoding='UTF-8'?>", content) 

49 self.assertIn( 

50 "<title>Snapcraft - recently updated snaps</title>", content 

51 ) 

52 

53 try: 

54 root = ET.fromstring(content) 

55 except ET.ParseError as e: 

56 self.fail(f"Returned content is not valid XML: {e}") 

57 

58 self.assertEqual(root.tag, "rss") 

59 channel = root.find("channel") 

60 self.assertIsNotNone(channel, "No <channel> element found in RSS feed") 

61 

62 items = channel.findall("item") 

63 self.assertTrue( 

64 any(item.findtext("title") == "Test Snap" for item in items) 

65 ) 

66 self.assertIn("<description>", content) 

67 self.assertIn("Test Publisher", content) 

68 self.assertIn("https://snapcraft.io/test-snap", content) 

69 

70 

71if __name__ == "__main__": 

72 unittest.main()