Coverage for tests/test_search.py: 100%

102 statements  

« prev     ^ index     » next       coverage.py v7.16.1, created at 2026-09-18 22:11 +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 "result.deployable-on" 

35 } 

36 ), 

37 ] 

38 ) 

39 

40 @responses.activate 

41 def test_all_charms(self): 

42 responses.add( 

43 responses.Response( 

44 method="GET", 

45 url=self.charmhub_api_url, 

46 body=json.dumps(sample_packages_api_response), 

47 status=200, 

48 ) 

49 ) 

50 

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

52 self.assertEqual(response.status_code, 200) 

53 self.assertEqual(len(response.json["charms"]), 3) 

54 self.assertEqual(len(response.json), 1) 

55 self.assertIsInstance(response.json["charms"], list) 

56 self.assertNotIn("bundles", response.json) 

57 self.assertNotIn("docs", response.json) 

58 self.assertNotIn("topics", response.json) 

59 

60 @responses.activate 

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.views.search_topics") 

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

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

88 @patch("webapp.search.views.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["charms"] 

97 mock_search_bundles.return_value = sample_bundles["bundles"] 

98 mock_search_docs.return_value = sample_docs["docs"] 

99 mock_search_topics.return_value = sample_topics["topics"] 

100 

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

102 

103 self.assertEqual(all_search_response.status_code, 200) 

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

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

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

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

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

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

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

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

112 

113 self.assertEqual(all_search_response.status_code, 200) 

114 self.assertLessEqual(len(all_search_response.json["docs"]), 5) 

115 self.assertIn("path", all_search_response.json["docs"][0]) 

116 

117 self.assertTrue( 

118 all( 

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

120 for topic in all_search_response.json["topics"] 

121 ) 

122 ) 

123 

124 @patch("webapp.search.views.search_docs") 

125 def test_search_all_docs(self, mock_search_docs): 

126 mock_search_docs.return_value = sample_docs["docs"] 

127 all_docs_response = self.client.get("/all-docs?q=test") 

128 

129 self.assertEqual(all_docs_response.status_code, 200) 

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

131 self.assertIsInstance(all_docs_response.json["docs"], list) 

132 self.assertEqual(len(all_docs_response.json["docs"]), 2) 

133 

134 @patch("webapp.search.views.search_topics") 

135 def test_search_all_topics(self, mock_search_topics): 

136 mock_search_topics.return_value = sample_topics["topics"] 

137 all_topics_response = self.client.get("/all-topics?q=test") 

138 

139 self.assertEqual(all_topics_response.status_code, 200) 

140 self.assertIn("topics", all_topics_response.json) 

141 self.assertIn("total_pages", all_topics_response.json) 

142 self.assertEqual(all_topics_response.json["total_pages"], 1) 

143 self.assertIsInstance(all_topics_response.json["topics"], list) 

144 self.assertEqual(len(all_topics_response.json["topics"]), 5) 

145 

146 @patch("webapp.search.views.search_topics") 

147 @patch("webapp.search.views.search_docs") 

148 @patch("webapp.search.views.search_bundles") 

149 @patch("webapp.search.views.search_charms") 

150 def test_search_with_limit( 

151 self, 

152 mock_search_charms, 

153 mock_search_bundles, 

154 mock_search_docs, 

155 mock_search_topics, 

156 ): 

157 mock_search_charms.return_value = sample_charms["charms"] 

158 mock_search_bundles.return_value = sample_bundles["bundles"] 

159 mock_search_docs.return_value = sample_docs["docs"] 

160 mock_search_topics.return_value = sample_topics["topics"] 

161 

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

163 

164 self.assertEqual(response.status_code, 200) 

165 self.assertIn("charms", response.json) 

166 self.assertIsInstance(response.json["charms"], list) 

167 self.assertEqual(len(response.json["charms"]), 2) 

168 self.assertIn("bundles", response.json) 

169 self.assertIsInstance(response.json["bundles"], list) 

170 self.assertEqual(len(response.json["bundles"]), 2) 

171 self.assertIn("docs", response.json) 

172 self.assertIsInstance(response.json["docs"], list) 

173 self.assertEqual(len(response.json["docs"]), 2) 

174 self.assertIn("topics", response.json) 

175 self.assertIsInstance(response.json["topics"], list) 

176 self.assertEqual(len(response.json["topics"]), 2)