Coverage for tests/endpoints/publisher/tests_publicise.py: 100%
69 statements
« prev ^ index » next coverage.py v7.10.5, created at 2025-08-26 22:06 +0000
« prev ^ index » next coverage.py v7.10.5, created at 2025-08-26 22:06 +0000
1from unittest.mock import patch
2from canonicalwebteam.exceptions import StoreApiError
3from tests.endpoints.endpoint_testing import TestEndpoints
6class TestGetPubliciseData(TestEndpoints):
7 @patch("webapp.endpoints.publisher.publicise.device_gateway")
8 @patch("webapp.endpoints.publisher.publicise.dashboard")
9 def test_get_publicise_data_success_with_trending(
10 self, mock_dashboard, mock_device_gateway
11 ):
12 # Mock the snap details returned by the dashboard
13 mock_snap_details = {
14 "snap_name": "test-snap",
15 "private": False,
16 "channel_maps_list": [
17 {
18 "channel": {
19 "name": "stable",
20 "track": "latest",
21 "risk": "stable",
22 }
23 }
24 ],
25 }
26 mock_dashboard.get_snap_info.return_value = mock_snap_details
28 # Mock device gateway response with trending
29 mock_public_details = {"snap": {"trending": True}}
30 mock_device_gateway.get_item_details.return_value = mock_public_details
32 # Make the request
33 response = self.client.get("/api/test-snap/publicise")
34 data = response.json
36 # Assert response structure
37 self.assertEqual(response.status_code, 200)
38 self.assertTrue(data["success"])
39 self.assertIn("data", data)
41 # Assert data content
42 response_data = data["data"]
43 self.assertTrue(response_data["is_released"])
44 self.assertTrue(response_data["trending"])
45 self.assertFalse(response_data["private"])
47 # Verify mocks were called correctly
48 mock_dashboard.get_snap_info.assert_called_once()
49 mock_device_gateway.get_item_details.assert_called_once_with(
50 "test-snap", api_version=2, fields=["trending", "private"]
51 )
53 @patch("webapp.endpoints.publisher.publicise.device_gateway")
54 @patch("webapp.endpoints.publisher.publicise.dashboard")
55 def test_get_publicise_data_success_without_trending(
56 self, mock_dashboard, mock_device_gateway
57 ):
58 # Mock the snap details returned by the dashboard
59 mock_snap_details = {
60 "snap_name": "test-snap",
61 "private": True,
62 "channel_maps_list": [], # Empty list means not released
63 }
64 mock_dashboard.get_snap_info.return_value = mock_snap_details
66 # Mock device gateway to raise StoreApiError
67 mock_device_gateway.get_item_details.side_effect = StoreApiError(
68 "API Error", 500
69 )
71 # Make the request
72 response = self.client.get("/api/test-snap/publicise")
73 data = response.json
75 # Assert response structure
76 self.assertEqual(response.status_code, 200)
77 self.assertTrue(data["success"])
78 self.assertIn("data", data)
80 # Assert data content
81 response_data = data["data"]
82 # Empty channel_maps_list means not released
83 self.assertFalse(response_data["is_released"])
84 self.assertFalse(response_data["trending"]) # Default when API fails
85 self.assertTrue(response_data["private"])
87 # Verify mocks were called correctly
88 mock_dashboard.get_snap_info.assert_called_once()
89 mock_device_gateway.get_item_details.assert_called_once_with(
90 "test-snap", api_version=2, fields=["trending", "private"]
91 )
93 @patch("webapp.endpoints.publisher.publicise.device_gateway")
94 @patch("webapp.endpoints.publisher.publicise.dashboard")
95 def test_get_publicise_data_released_snap(
96 self, mock_dashboard, mock_device_gateway
97 ):
98 # Mock the snap details with multiple channels
99 mock_snap_details = {
100 "snap_name": "test-snap",
101 "private": False,
102 "channel_maps_list": [
103 {"channel": {"name": "stable"}},
104 {"channel": {"name": "beta"}},
105 {"channel": {"name": "edge"}},
106 ],
107 }
108 mock_dashboard.get_snap_info.return_value = mock_snap_details
110 # Mock device gateway response
111 mock_public_details = {"snap": {"trending": False}}
112 mock_device_gateway.get_item_details.return_value = mock_public_details
114 # Make the request
115 response = self.client.get("/api/test-snap/publicise")
116 data = response.json
118 # Assert response
119 self.assertEqual(response.status_code, 200)
120 self.assertTrue(data["success"])
122 response_data = data["data"]
123 self.assertTrue(response_data["is_released"]) # Has channels
124 self.assertFalse(response_data["trending"])
125 self.assertFalse(response_data["private"])
127 @patch("webapp.endpoints.publisher.publicise.device_gateway")
128 @patch("webapp.endpoints.publisher.publicise.dashboard")
129 def test_get_publicise_data_private_snap(
130 self, mock_dashboard, mock_device_gateway
131 ):
132 # Mock private snap details
133 mock_snap_details = {
134 "snap_name": "private-snap",
135 "private": True,
136 "channel_maps_list": [{"channel": {"name": "stable"}}],
137 }
138 mock_dashboard.get_snap_info.return_value = mock_snap_details
140 # Mock device gateway response
141 mock_public_details = {"snap": {"trending": True}}
142 mock_device_gateway.get_item_details.return_value = mock_public_details
144 # Make the request
145 response = self.client.get("/api/private-snap/publicise")
146 data = response.json
148 # Assert response
149 self.assertEqual(response.status_code, 200)
150 self.assertTrue(data["success"])
152 response_data = data["data"]
153 self.assertTrue(response_data["is_released"])
154 self.assertTrue(response_data["trending"])
155 self.assertTrue(response_data["private"])