Coverage for tests/test_search.py: 100%

71 statements  

« prev     ^ index     » next       coverage.py v7.9.1, created at 2025-06-27 22:07 +0000

1import json 

2from unittest import TestCase 

3from unittest.mock import patch 

4from urllib.parse import urlencode 

5 

6import responses 

7 

8from webapp.app import app 

9from mock_data.search_mock import ( 

10 sample_packages_api_response, 

11 sample_charms, 

12 sample_bundles, 

13 sample_docs, 

14 sample_topics, 

15) 

16 

17 

18class TestSearchPackage(TestCase): 

19 def setUp(self): 

20 app.config["TESTING"] = True 

21 app.config["DEBUG"] = True 

22 self.client = app.test_client() 

23 

24 self.charmhub_api_url = "".join( 

25 [ 

26 "https://api.charmhub.io/v2/", 

27 "charms/find", 

28 "?q=juju&category=&publisher=&", 

29 urlencode( 

30 { 

31 "fields": "result.categories,result.summary," 

32 "result.media,result.title," 

33 "result.publisher.display-name," 

34 "default-release.revision.revision," 

35 "default-release.channel," 

36 "result.deployable-on" 

37 } 

38 ), 

39 ] 

40 ) 

41 

42 def test_all_charms(self): 

43 responses.add( 

44 responses.Response( 

45 method="GET", 

46 url=self.charmhub_api_url, 

47 body=json.dumps(sample_packages_api_response), 

48 status=200, 

49 ) 

50 ) 

51 

52 response1 = self.client.get("/all-charms?q=juju&limit=3") 

53 self.assertEqual(response1.status_code, 200) 

54 self.assertEqual(len(response1.json["charms"]), 3) 

55 self.assertEqual(len(response1.json), 1) 

56 self.assertIsInstance(response1.json["charms"], list) 

57 self.assertNotIn("bundles", response1.json) 

58 self.assertNotIn("docs", response1.json) 

59 self.assertNotIn("topics", response1.json) 

60 

61 def test_all_bundles(self): 

62 responses.add( 

63 responses.Response( 

64 method="GET", 

65 url=self.charmhub_api_url, 

66 body=json.dumps(sample_packages_api_response), 

67 status=200, 

68 ) 

69 ) 

70 

71 bundle_response = self.client.get("/all-bundles?q=juju&limit=2") 

72 self.assertEqual(bundle_response.status_code, 200) 

73 self.assertEqual(len(bundle_response.json["bundles"]), 2) 

74 self.assertEqual(len(bundle_response.json), 1) 

75 self.assertEqual(type((bundle_response.json["bundles"])), list) 

76 self.assertNotIn("charms", bundle_response.json) 

77 self.assertNotIn("docs", bundle_response.json) 

78 self.assertNotIn("topics", bundle_response.json) 

79 

80 

81class TestAllSearchView(TestCase): 

82 def setUp(self): 

83 self.client = app.test_client() 

84 

85 @patch("webapp.search.logic.search_topics") 

86 @patch("webapp.search.logic.search_docs") 

87 @patch("webapp.search.logic.search_bundles") 

88 @patch("webapp.search.logic.search_charms") 

89 def test_search( 

90 self, 

91 mock_search_charms, 

92 mock_search_bundles, 

93 mock_search_docs, 

94 mock_search_topics, 

95 ): 

96 mock_search_charms.return_value = sample_charms 

97 mock_search_bundles.return_value = sample_bundles 

98 mock_search_docs.return_value.json = sample_docs 

99 mock_search_topics.return_value = sample_topics 

100 

101 all_search_response = self.client.get("/all-search.json?q=juju") 

102 all_docs_response = self.client.get("/all-docs?q=juju&limit=3") 

103 all_topics_response = self.client.get("/all-topics?q=juju") 

104 

105 self.assertEqual(all_search_response.status_code, 200) 

106 self.assertIn("docs", all_docs_response.json) 

107 self.assertIn("charms", all_search_response.json) 

108 self.assertIn("bundles", all_search_response.json) 

109 self.assertIn("docs", all_search_response.json) 

110 self.assertIsInstance(all_search_response.json["charms"], list) 

111 self.assertIsInstance(all_search_response.json["bundles"], list) 

112 self.assertIsInstance(all_search_response.json["docs"], list) 

113 self.assertIsInstance(all_search_response.json["topics"], list) 

114 

115 self.assertEqual(all_docs_response.status_code, 200) 

116 self.assertLessEqual(len(all_docs_response.json["docs"]), 3) 

117 self.assertIn("path", all_docs_response.json["docs"][0]) 

118 

119 self.assertEqual(all_topics_response.status_code, 200) 

120 self.assertTrue( 

121 all( 

122 topic.get("archived", False) is not True 

123 for topic in all_topics_response.json["topics"] 

124 ) 

125 ) 

126 

127 @patch("webapp.search.logic.search_charms") 

128 def test_search_with_single_type(self, mock_search_charms): 

129 mock_search_charms.return_value = sample_charms 

130 response = self.client.get("/all-search.json?q=test&limit=2") 

131 data = json.loads(response.data) 

132 

133 self.assertEqual(response.status_code, 200) 

134 self.assertIn("charms", data) 

135 self.assertIsInstance(data["charms"], list) 

136 self.assertEqual(len(data["charms"]), 2)