Coverage for tests/endpoints/tests_signing_keys.py: 100%
78 statements
« prev ^ index » next coverage.py v7.10.2, created at 2025-08-05 22:06 +0000
« prev ^ index » next coverage.py v7.10.2, created at 2025-08-05 22:06 +0000
1from unittest.mock import patch, Mock
2from tests.endpoints.endpoint_testing import TestModelServiceEndpoints
3from canonicalwebteam.exceptions import StoreApiResponseErrorList
6class TestGetSigningKeys(TestModelServiceEndpoints):
7 @patch(
8 "canonicalwebteam.store_api.dashboard.Dashboard.get_store",
9 Mock(return_value={"brand-id": "BrandName"}),
10 )
11 @patch(
12 "canonicalwebteam.store_api.publishergw."
13 "PublisherGW.get_store_signing_keys"
14 )
15 def test_get_signing_keys(self, mock_get_store_signing_keys):
16 mock_get_store_signing_keys.return_value = [
17 {"sha3-384": "key1"},
18 {"sha3-384": "key2"},
19 ]
21 response = self.client.get("/api/store/1/signing-keys")
22 data = response.json
24 self.assertEqual(response.status_code, 200)
25 self.assertTrue(data["success"])
26 self.assertEqual(
27 data["data"],
28 [{"sha3-384": "key1"}, {"sha3-384": "key2"}],
29 )
31 @patch(
32 "canonicalwebteam.store_api.dashboard.Dashboard.get_store",
33 Mock(return_value={"brand-id": "BrandName"}),
34 )
35 @patch(
36 "canonicalwebteam.store_api.publishergw."
37 "PublisherGW.get_store_signing_keys"
38 )
39 def test_failed_get_signing_keys(self, mock_get_store_signing_keys):
40 mock_get_store_signing_keys.side_effect = StoreApiResponseErrorList(
41 "error", 502, [{"message": "An error occurred"}]
42 )
44 response = self.client.get("/api/store/1/signing-keys")
45 data = response.json
47 self.assertEqual(response.status_code, 500)
48 self.assertFalse(data["success"])
49 self.assertEqual(data["message"], "An error occurred")
52class TestCreateSigningKeys(TestModelServiceEndpoints):
53 @patch(
54 "canonicalwebteam.store_api.publishergw."
55 "PublisherGW.create_store_signing_key"
56 )
57 def test_create_signing_key(self, mock_create_store_signing_key):
58 mock_create_store_signing_key.return_value = None
60 payload = {"name": "test_signing_key"}
61 response = self.client.post(
62 "/api/store/1/signing-keys",
63 data=payload,
64 )
65 self.assertEqual(response.status_code, 200)
66 data = response.json
67 self.assertTrue(data["success"])
69 def test_name_too_long_create_signing_key(self):
70 payload = {"name": "random name" * 12}
71 response = self.client.post("/api/store/1/signing-keys", data=payload)
72 data = response.json
74 self.assertEqual(response.status_code, 500)
75 self.assertFalse(data["success"])
76 self.assertEqual(
77 data["message"],
78 "Invalid signing key. Limit 128 characters",
79 )
81 @patch(
82 "canonicalwebteam.store_api.publishergw."
83 "PublisherGW.create_store_signing_key"
84 )
85 def test_exception_in_create_signing_key(
86 self,
87 mock_create_store_signing_key,
88 ):
89 mock_create_store_signing_key.side_effect = StoreApiResponseErrorList(
90 "An error occurred", 500, [{"message": "An error occurred"}]
91 )
93 payload = {"name": "test_signing_key"}
94 response = self.client.post(
95 "/api/store/1/signing-keys",
96 data=payload,
97 )
98 data = response.json
100 self.assertEqual(response.status_code, 500)
101 self.assertFalse(data["success"])
102 self.assertEqual(data["message"], "An error occurred")
105class TestDeleteSigningKeys(TestModelServiceEndpoints):
106 @patch(
107 "canonicalwebteam.store_api.dashboard.Dashboard.get_store",
108 Mock(return_value={"brand-id": "BrandName"}),
109 )
110 @patch(
111 "canonicalwebteam.store_api.publishergw."
112 "PublisherGW.delete_store_signing_key"
113 )
114 def test_successful_delete_signing_key(
115 self,
116 mock_delete_store_signing_key,
117 ):
118 mock_delete_store_signing_key.return_value = Mock(status_code=204)
120 response = self.client.delete(
121 "/api/store/1/signing-keys/signing_key_sha3_384"
122 )
123 data = response.json
125 self.assertEqual(response.status_code, 200)
126 self.assertTrue(data["success"])
128 @patch(
129 "canonicalwebteam.store_api.dashboard.Dashboard.get_store",
130 Mock(return_value={"brand-id": "BrandName"}),
131 )
132 @patch(
133 "canonicalwebteam.store_api.publishergw."
134 "PublisherGW.delete_store_signing_key"
135 )
136 @patch(
137 "canonicalwebteam.store_api.publishergw."
138 "PublisherGW.get_store_models"
139 )
140 @patch(
141 "canonicalwebteam.store_api.publishergw."
142 "PublisherGW.get_store_model_policies"
143 )
144 def test_signing_key_in_use(
145 self, mock_get_policies, mock_get_models, mock_delete_store_signing_key
146 ):
147 mock_delete_store_signing_key.side_effect = StoreApiResponseErrorList(
148 "Signing key is in use",
149 409,
150 [{"message": "key used to sign at least one serial policy"}],
151 )
152 mock_get_models.return_value = [{"name": "Model1"}]
153 mock_get_policies.return_value = [
154 {"revision": "1", "signing-key-sha3-384": "valid_key"}
155 ]
157 response = self.client.delete("/api/store/1/signing-keys/valid_key")
158 data = response.json
160 self.assertEqual(response.status_code, 500)
161 self.assertEqual(
162 data["message"],
163 "Signing key is used in at least one policy",
164 )
165 self.assertEqual(
166 data["data"]["models"],
167 [{"name": "Model1", "policies": [{"revision": "1"}]}],
168 )
170 @patch(
171 "canonicalwebteam.store_api.dashboard.Dashboard.get_store",
172 Mock(return_value={"brand-id": "BrandName"}),
173 )
174 @patch(
175 "canonicalwebteam.store_api.publishergw."
176 "PublisherGW.delete_store_signing_key"
177 )
178 def test_signing_key_not_found(self, mock_delete_store_signing_key):
179 mock_delete_store_signing_key.return_value = Mock(status_code=404)
181 response = self.client.delete("/api/store/1/signing-keys/invalid_key")
182 data = response.json
184 self.assertEqual(response.status_code, 404)
185 self.assertFalse(data["success"])
186 self.assertEqual(data["message"], "Signing key not found")