Coverage for tests/store/test_details_overview.py: 100%
64 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
1from unittest import TestCase
2from unittest.mock import patch
3from webapp.app import app
4from webapp.store.views import get_libraries, get_package_details
5from mock_data.mock_store_logic import sample_package_detail
6import copy
9class TestDetailsOverview(TestCase):
10 def setUp(self):
11 app.testing = True
12 self.client = app.test_client()
14 @patch("webapp.store.views.redis_cache.get")
15 @patch("webapp.store.views.get_package_details")
16 def test_details_with_discourse_link(self, mock_find, mock_cache_get):
17 mock_find.return_value = sample_package_detail
18 mock_cache_get.return_value = None
19 response = self.client.get("/test")
20 self.assertNotIn(b"Read documentation", response.data)
21 self.assertEqual(response.status_code, 200)
23 @patch("webapp.store.views.redis_cache.get")
24 @patch("webapp.store.views.get_package_details")
25 def test_details_with_readthedocs_link(self, mock_find, mock_cache_get):
26 data = copy.deepcopy(sample_package_detail)
27 data["default-release"]["revision"][
28 "metadata-yaml"
29 ] = """
30 docs: https://readthedocs.charmhub.io/t/xxx
31 """
32 mock_find.return_value = data
33 mock_cache_get.return_value = None
34 response = self.client.get("/test")
35 self.assertIn(b"Read documentation", response.data)
36 self.assertNotIn(b"Add docs to a charm", response.data)
37 self.assertEqual(response.status_code, 200)
39 @patch("webapp.store.logic.process_libraries")
40 @patch("webapp.store_api.publisher_gateway.get_charm_libraries")
41 @patch("webapp.store.views.redis_cache.set")
42 @patch("webapp.store.views.redis_cache.get", return_value=["lib1", "lib2"])
43 def test_get_libraries_from_cache(
44 self, _, mock_cache_set, mock_publishergw, mock_process
45 ):
46 result = get_libraries("test-package")
47 self.assertEqual(result, ["lib1", "lib2"])
48 mock_publishergw.assert_not_called()
49 mock_process.assert_not_called()
50 mock_cache_set.assert_not_called()
52 @patch(
53 "webapp.store.logic.process_libraries", return_value=["processed-lib"]
54 )
55 @patch(
56 "webapp.store_api.publisher_gateway.get_charm_libraries",
57 return_value=["raw-lib"],
58 )
59 @patch("webapp.store.views.redis_cache.set")
60 @patch("webapp.store.views.redis_cache.get", return_value=None)
61 def test_get_libraries_from_gateway_on_cache_miss(
62 self, _, mock_set, mock_publishergw, mock_process
63 ):
64 result = get_libraries("test-package")
65 self.assertEqual(result, ["processed-lib"])
66 mock_publishergw.assert_called_once_with("test-package")
67 mock_process.assert_called_once_with(["raw-lib"])
68 mock_set.assert_called_once_with(
69 "test-package:libraries", ["processed-lib"], ttl=600
70 )
72 @patch("webapp.store.views.redis_cache.set")
73 @patch(
74 "webapp.store.views.redis_cache.get",
75 return_value={"name": "test-package"},
76 )
77 def test_get_package_details_from_cache(self, _, mock_cache_set):
78 result = get_package_details(
79 "test-package", "stable", fields=["result.name"]
80 )
81 self.assertEqual(result, {"name": "test-package"})
82 mock_cache_set.assert_not_called()
84 @patch(
85 "webapp.store_api.device_gateway.get_item_details",
86 return_value={"name": "test-package"},
87 )
88 @patch("webapp.store.views.redis_cache.set")
89 @patch("webapp.store.views.redis_cache.get", return_value=None)
90 def test_get_package_details_from_gateway_on_cache_miss(
91 self, _, mock_set, mock_publishergw
92 ):
93 result = get_package_details(
94 "test-package", "stable", fields=["result.name"]
95 )
96 expected_key = (
97 "package_details:test-package",
98 {"channel": "stable", "fields": "result.name"},
99 )
100 self.assertEqual(result, {"name": "test-package"})
101 mock_publishergw.assert_called_once_with(
102 "test-package", channel="stable", fields=["result.name"]
103 )
104 mock_set.assert_called_once_with(
105 expected_key, {"name": "test-package"}, ttl=600
106 )