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
« 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
6import responses
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)
18class TestSearchPackage(TestCase):
19 def setUp(self):
20 app.config["TESTING"] = True
21 app.config["DEBUG"] = True
22 self.client = app.test_client()
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 )
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 )
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)
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 )
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)
81class TestAllSearchView(TestCase):
82 def setUp(self):
83 self.client = app.test_client()
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"]
101 all_search_response = self.client.get("/all-search.json?q=test")
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)
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])
117 self.assertTrue(
118 all(
119 topic.get("archived", False) is not True
120 for topic in all_search_response.json["topics"]
121 )
122 )
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")
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)
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")
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)
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"]
162 response = self.client.get("/all-search.json?q=test&limit=2")
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)