Coverage for tests/publisher/tests_account_snaps_metrics.py: 100%
56 statements
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-14 22:07 +0000
« prev ^ index » next coverage.py v7.10.7, created at 2025-10-14 22:07 +0000
1import json
2import responses
3from tests.publisher.endpoint_testing import BaseTestCases
5# Make sure tests fail on stray responses.
6responses.mock.assert_all_requests_are_fired = True
9class AccountSnapsMetricsNotAuth(BaseTestCases.EndpointLoggedOut):
10 def setUp(self):
11 endpoint_url = "/snaps/metrics/json"
12 super().setUp(
13 snap_name=None, endpoint_url=endpoint_url, method_endpoint="POST"
14 )
17class AccountSnapsMetrics(BaseTestCases.BaseAppTesting):
18 def setUp(self):
19 api_url = "https://dashboard.snapcraft.io/dev/api/snaps/metrics"
20 endpoint_url = "/snaps/metrics/json"
21 super().setUp(
22 snap_name=None, endpoint_url=endpoint_url, api_url=api_url
23 )
24 self.authorization = self._log_in(self.client)
26 @responses.activate
27 def test_metrics(self):
28 metrics_payload = {
29 "metrics": [
30 {
31 "snap_id": "1",
32 "status": "OK",
33 "series": [
34 {"values": [0, 3], "name": "new"},
35 {"values": [2, 3], "name": "lost"},
36 {"values": [9, 6], "name": "continued"},
37 ],
38 "buckets": ["2018-04-13", "2018-04-20"],
39 },
40 {
41 "snap_id": "2",
42 "status": "NODATA",
43 "series": [],
44 "buckets": [],
45 },
46 ]
47 }
49 responses.add(
50 responses.POST, self.api_url, json=metrics_payload, status=200
51 )
53 payload = {"1": "test1", "2": "test2"}
54 headers = {"content-type": "application/json"}
55 response = self.client.post(
56 self.endpoint_url, data=json.dumps(payload), headers=headers
57 )
59 expected_response = {
60 "buckets": ["2018-04-13", "2018-04-20"],
61 "days_without_data": [],
62 "snaps": [
63 {
64 "id": "1",
65 "name": None,
66 "series": [
67 {"name": "new", "values": [0, 3]},
68 {"name": "lost", "values": [2, 3]},
69 {"name": "continued", "values": [9, 6]},
70 ],
71 }
72 ],
73 }
75 self.assertEqual(200, response.status_code)
76 self.assertEqual(expected_response, response.json)
77 self.assertEqual(1, len(responses.calls))
78 called = responses.calls[0]
79 self.assertEqual(self.api_url, called.request.url)
80 self.assertEqual(
81 self.authorization, called.request.headers.get("Authorization")
82 )
84 @responses.activate
85 def test_metrics_no_payload(self):
86 headers = {"content-type": "application/json"}
87 response = self.client.post(self.endpoint_url, headers=headers)
89 expected_response = {"error": "Please provide a list of snaps"}
91 self.assertEqual(500, response.status_code)
92 self.assertEqual(expected_response, response.json)
94 @responses.activate
95 def test_metrics_bad_id_payload(self):
96 headers = {"content-type": "application/json"}
98 metrics_payload = {
99 "error_list": [{"message": "Error", "code": "invalid"}]
100 }
102 responses.add(
103 responses.POST, self.api_url, json=metrics_payload, status=400
104 )
106 payload = {"badid": "badname"}
107 response = self.client.post(
108 self.endpoint_url, data=json.dumps(payload), headers=headers
109 )
111 expected_response = {
112 "error": "An error occured while fetching metrics"
113 }
115 self.assertEqual(500, response.status_code)
116 self.assertEqual(expected_response, response.json)
118 @responses.activate
119 def test_metrics_with_empty_data(self):
120 metrics_payload = {
121 "metrics": [
122 {
123 "snap_id": "1",
124 "status": "OK",
125 "series": [
126 {"values": [0, 3, None], "name": "new"},
127 {"values": [2, 3, None], "name": "lost"},
128 {"values": [9, 6, None], "name": "continued"},
129 ],
130 "buckets": ["2018-04-13", "2018-04-20", "2018-04-21"],
131 },
132 ]
133 }
135 responses.add(
136 responses.POST, self.api_url, json=metrics_payload, status=200
137 )
139 payload = {"1": "test1"}
140 headers = {"content-type": "application/json"}
141 response = self.client.post(
142 self.endpoint_url, data=json.dumps(payload), headers=headers
143 )
145 expected_response = {
146 "buckets": ["2018-04-13", "2018-04-20", "2018-04-21"],
147 "days_without_data": ["2018-04-21"],
148 "snaps": [
149 {
150 "id": "1",
151 "name": None,
152 "series": [
153 {"name": "new", "values": [0, 3, None]},
154 {"name": "lost", "values": [2, 3, None]},
155 {"name": "continued", "values": [9, 6, None]},
156 ],
157 }
158 ],
159 }
161 self.assertEqual(200, response.status_code)
162 self.assertEqual(expected_response, response.json)
163 self.assertEqual(1, len(responses.calls))