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
« 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
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 "default-release.revision.revision,"
35 "default-release.channel,"
36 "result.deployable-on"
37 }
38 ),
39 ]
40 )
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 )
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)
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.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
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")
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)
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])
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 )
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)
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)