Coverage for tests/publisher/snaps/tests_get_metrics.py : 100%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import random
2from datetime import datetime
4import responses
5from tests.publisher.endpoint_testing import BaseTestCases
8class MetricsPageNotAuth(BaseTestCases.EndpointLoggedOut):
9 def setUp(self):
10 snap_name = "test-snap"
11 endpoint_url = "/{}/metrics".format(snap_name)
13 super().setUp(snap_name=snap_name, endpoint_url=endpoint_url)
16class GetMetricsGetInfoPage(BaseTestCases.EndpointLoggedInErrorHandling):
17 def setUp(self):
18 snap_name = "test-snap"
20 api_url = "https://dashboard.snapcraft.io/dev/api/snaps/info/{}"
21 api_url = api_url.format(snap_name)
22 endpoint_url = "/{}/metrics".format(snap_name)
24 super().setUp(
25 snap_name=snap_name,
26 endpoint_url=endpoint_url,
27 method_endpoint="GET",
28 api_url=api_url,
29 method_api="GET",
30 )
33class GetMetricsPostMetrics(BaseTestCases.EndpointLoggedInErrorHandling):
34 def setUp(self):
35 snap_name = "test-snap"
37 self.snap_id = "complexId"
38 info_url = "https://dashboard.snapcraft.io/dev/api/snaps/info/{}"
39 self.info_url = info_url.format(snap_name)
41 payload = {
42 "snap_id": "id",
43 "title": "Test Snap",
44 "private": False,
45 "categories": {
46 "items": [{"name": "test", "since": "2018-01-01T00:00:00"}]
47 },
48 "publisher": {"display-name": "test"},
49 }
51 responses.add(responses.GET, self.info_url, json=payload, status=200)
53 api_url = "https://dashboard.snapcraft.io/dev/api/snaps/metrics"
54 endpoint_url = "/{}/metrics".format(snap_name)
56 super().setUp(
57 snap_name=snap_name,
58 endpoint_url=endpoint_url,
59 api_url=api_url,
60 method_endpoint="GET",
61 method_api="POST",
62 )
64 @responses.activate
65 def test_no_data(self):
66 payload = {
67 "metrics": [
68 {
69 "status": "NO DATA",
70 "series": [],
71 "buckets": [],
72 "metric_name": "weekly_installed_base_by_version",
73 },
74 {
75 "status": "NO DATA",
76 "series": [],
77 "buckets": [],
78 "metric_name": "weekly_installed_base_by_country",
79 },
80 ]
81 }
83 responses.add(responses.POST, self.api_url, json=payload, status=200)
85 response = self.client.get(self.endpoint_url)
87 self.assertEqual(3, len(responses.calls))
88 called = responses.calls[0]
89 self.assertEqual(self.info_url, called.request.url)
90 self.assertEqual(
91 self.authorization, called.request.headers.get("Authorization")
92 )
93 called = responses.calls[1]
94 self.assertEqual(self.api_url, called.request.url)
95 self.assertEqual(
96 self.authorization, called.request.headers.get("Authorization")
97 )
99 self.assertEqual(response.status_code, 200)
100 self.assert_template_used("publisher/metrics.html")
101 self.assert_context("snap_name", self.snap_name)
102 self.assert_context("snap_title", "Test Snap")
103 self.assert_context("metric_period", "30d")
104 self.assert_context("active_device_metric", "version")
105 self.assert_context("nodata", True)
107 @responses.activate
108 def test_data_version_1_year(self):
109 random_values = random.sample(range(1, 30), 29)
110 dates = [
111 datetime(2018, 3, day).strftime("%Y-%m-%d") for day in range(1, 30)
112 ]
113 countries = [
114 {"values": [2], "name": "FR"},
115 {"values": [3], "name": "GB"},
116 ]
117 payload = {
118 "metrics": [
119 {
120 "status": "OK",
121 "series": [{"values": random_values, "name": "0.1"}],
122 "buckets": dates,
123 "metric_name": "weekly_installed_base_by_version",
124 },
125 {
126 "status": "OK",
127 "series": countries,
128 "buckets": ["2018-03-18"],
129 "metric_name": "weekly_installed_base_by_country",
130 },
131 ]
132 }
133 responses.add(responses.POST, self.api_url, json=payload, status=200)
135 response = self.client.get(self.endpoint_url + "?period=1y")
137 self.assertEqual(3, len(responses.calls))
138 called = responses.calls[0]
139 self.assertEqual(self.info_url, called.request.url)
140 self.assertEqual(
141 self.authorization, called.request.headers.get("Authorization")
142 )
143 called = responses.calls[1]
144 self.assertEqual(self.api_url, called.request.url)
145 self.assertEqual(
146 self.authorization, called.request.headers.get("Authorization")
147 )
149 self.assertEqual(response.status_code, 200)
150 self.assert_template_used("publisher/metrics.html")
151 self.assert_context("snap_name", self.snap_name)
152 self.assert_context("snap_title", "Test Snap")
153 self.assert_context("metric_period", "1y")
154 self.assert_context("active_device_metric", "version")
155 self.assert_context("nodata", False)
157 @responses.activate
158 def test_data_version_1_month(self):
159 random_values = random.sample(range(1, 30), 29)
160 dates = [
161 datetime(2018, 3, day).strftime("%Y-%m-%d") for day in range(1, 30)
162 ]
163 countries = [
164 {"values": [2], "name": "FR"},
165 {"values": [3], "name": "GB"},
166 ]
167 payload = {
168 "metrics": [
169 {
170 "status": "OK",
171 "series": [{"values": random_values, "name": "0.1"}],
172 "buckets": dates,
173 "metric_name": "weekly_installed_base_by_version",
174 },
175 {
176 "status": "OK",
177 "series": countries,
178 "buckets": ["2018-03-18"],
179 "metric_name": "weekly_installed_base_by_country",
180 },
181 ]
182 }
183 responses.add(responses.POST, self.api_url, json=payload, status=200)
185 response = self.client.get(self.endpoint_url + "?period=30d")
187 self.assertEqual(3, len(responses.calls))
188 called = responses.calls[0]
189 self.assertEqual(self.info_url, called.request.url)
190 self.assertEqual(
191 self.authorization, called.request.headers.get("Authorization")
192 )
193 called = responses.calls[1]
194 self.assertEqual(self.api_url, called.request.url)
195 self.assertEqual(
196 self.authorization, called.request.headers.get("Authorization")
197 )
199 self.assertEqual(response.status_code, 200)
200 self.assert_template_used("publisher/metrics.html")
201 self.assert_context("snap_name", self.snap_name)
202 self.assert_context("snap_title", "Test Snap")
203 self.assert_context("metric_period", "30d")
204 self.assert_context("active_device_metric", "version")
205 self.assert_context("nodata", False)
207 @responses.activate
208 def test_data_version_weekly(self):
209 random_values = random.sample(range(1, 30), 6)
210 dates = [
211 datetime(2018, 3, day).strftime("%Y-%m-%d") for day in range(1, 7)
212 ]
213 countries = [
214 {"values": [2], "name": "FR"},
215 {"values": [3], "name": "GB"},
216 ]
217 payload = {
218 "metrics": [
219 {
220 "status": "OK",
221 "series": [{"values": random_values, "name": "0.1"}],
222 "buckets": dates,
223 "metric_name": "weekly_installed_base_by_version",
224 },
225 {
226 "status": "OK",
227 "series": countries,
228 "buckets": ["2018-03-18"],
229 "metric_name": "weekly_installed_base_by_country",
230 },
231 ]
232 }
233 responses.add(responses.POST, self.api_url, json=payload, status=200)
235 response = self.client.get(self.endpoint_url + "?period=7d")
237 self.assertEqual(3, len(responses.calls))
238 called = responses.calls[0]
239 self.assertEqual(self.info_url, called.request.url)
240 self.assertEqual(
241 self.authorization, called.request.headers.get("Authorization")
242 )
243 called = responses.calls[1]
244 self.assertEqual(self.api_url, called.request.url)
245 self.assertEqual(
246 self.authorization, called.request.headers.get("Authorization")
247 )
249 self.assertEqual(response.status_code, 200)
250 self.assert_template_used("publisher/metrics.html")
251 self.assert_context("snap_name", self.snap_name)
252 self.assert_context("snap_title", "Test Snap")
253 self.assert_context("metric_period", "7d")
254 self.assert_context("active_device_metric", "version")
255 self.assert_context("nodata", False)
257 @responses.activate
258 def test_data_version_3_month(self):
259 random_values = random.sample(range(1, 100), 59)
260 dates = []
261 for month in range(4, 7):
262 dates = dates + [
263 datetime(2018, month, day).strftime("%Y-%m-%d")
264 for day in range(1, 30)
265 ]
267 countries = [
268 {"values": [2], "name": "FR"},
269 {"values": [3], "name": "GB"},
270 ]
271 payload = {
272 "metrics": [
273 {
274 "status": "OK",
275 "series": [{"values": random_values, "name": "0.1"}],
276 "buckets": dates,
277 "metric_name": "weekly_installed_base_by_version",
278 },
279 {
280 "status": "OK",
281 "series": countries,
282 "buckets": ["2018-03-18"],
283 "metric_name": "weekly_installed_base_by_country",
284 },
285 ]
286 }
287 responses.add(responses.POST, self.api_url, json=payload, status=200)
289 response = self.client.get(self.endpoint_url + "?period=3m")
291 self.assertEqual(3, len(responses.calls))
292 called = responses.calls[0]
293 self.assertEqual(self.info_url, called.request.url)
294 self.assertEqual(
295 self.authorization, called.request.headers.get("Authorization")
296 )
297 called = responses.calls[1]
298 self.assertEqual(self.api_url, called.request.url)
299 self.assertEqual(
300 self.authorization, called.request.headers.get("Authorization")
301 )
303 self.assertEqual(response.status_code, 200)
304 self.assert_template_used("publisher/metrics.html")
305 self.assert_context("snap_name", self.snap_name)
306 self.assert_context("snap_title", "Test Snap")
307 self.assert_context("metric_period", "3m")
308 self.assert_context("active_device_metric", "version")
309 self.assert_context("nodata", False)
311 @responses.activate
312 def test_data_os_7_days(self):
313 random_values = random.sample(range(1, 100), 59)
314 dates = [
315 datetime(2018, 3, day).strftime("%Y-%m-%d") for day in range(1, 7)
316 ]
317 countries = [
318 {"values": [2], "name": "FR"},
319 {"values": [3], "name": "GB"},
320 ]
321 payload = {
322 "metrics": [
323 {
324 "status": "OK",
325 "series": [
326 {"values": random_values, "name": "ubuntu/0.1"}
327 ],
328 "buckets": dates,
329 "metric_name": "weekly_installed_base_by_operating_system",
330 },
331 {
332 "status": "OK",
333 "series": countries,
334 "buckets": ["2018-03-18"],
335 "metric_name": "weekly_installed_base_by_country",
336 },
337 ]
338 }
339 responses.add(responses.POST, self.api_url, json=payload, status=200)
341 response = self.client.get(
342 self.endpoint_url + "?period=7d&active-devices=os"
343 )
345 self.assertEqual(3, len(responses.calls))
346 called = responses.calls[0]
347 self.assertEqual(self.info_url, called.request.url)
348 self.assertEqual(
349 self.authorization, called.request.headers.get("Authorization")
350 )
351 called = responses.calls[1]
352 self.assertEqual(self.api_url, called.request.url)
353 self.assertEqual(
354 self.authorization, called.request.headers.get("Authorization")
355 )
357 self.assertEqual(response.status_code, 200)
358 self.assert_template_used("publisher/metrics.html")
359 self.assert_context("snap_name", self.snap_name)
360 self.assert_context("snap_title", "Test Snap")
361 self.assert_context("metric_period", "7d")
362 self.assert_context("active_device_metric", "os")
363 self.assert_context("nodata", False)
365 @responses.activate
366 def test_data_os_1_year(self):
367 random_values = random.sample(range(1, 100), 59)
368 dates = [
369 datetime(2018, 3, day).strftime("%Y-%m-%d") for day in range(1, 30)
370 ]
371 countries = [
372 {"values": [2], "name": "FR"},
373 {"values": [3], "name": "GB"},
374 ]
375 payload = {
376 "metrics": [
377 {
378 "status": "OK",
379 "series": [
380 {"values": random_values, "name": "ubuntu/0.1"}
381 ],
382 "buckets": dates,
383 "metric_name": "weekly_installed_base_by_operating_system",
384 },
385 {
386 "status": "OK",
387 "series": countries,
388 "buckets": ["2018-03-18"],
389 "metric_name": "weekly_installed_base_by_country",
390 },
391 ]
392 }
393 responses.add(responses.POST, self.api_url, json=payload, status=200)
395 response = self.client.get(
396 self.endpoint_url + "?period=1y&active-devices=os"
397 )
399 self.assertEqual(3, len(responses.calls))
400 called = responses.calls[0]
401 self.assertEqual(self.info_url, called.request.url)
402 self.assertEqual(
403 self.authorization, called.request.headers.get("Authorization")
404 )
405 called = responses.calls[1]
406 self.assertEqual(self.api_url, called.request.url)
407 self.assertEqual(
408 self.authorization, called.request.headers.get("Authorization")
409 )
411 self.assertEqual(response.status_code, 200)
412 self.assert_template_used("publisher/metrics.html")
413 self.assert_context("snap_name", self.snap_name)
414 self.assert_context("snap_title", "Test Snap")
415 self.assert_context("metric_period", "1y")
416 self.assert_context("active_device_metric", "os")
417 self.assert_context("nodata", False)
419 @responses.activate
420 def test_data_os_1_month(self):
421 random_values = random.sample(range(1, 100), 59)
422 dates = [
423 datetime(2018, 3, day).strftime("%Y-%m-%d") for day in range(1, 30)
424 ]
425 countries = [
426 {"values": [2], "name": "FR"},
427 {"values": [3], "name": "GB"},
428 ]
429 payload = {
430 "metrics": [
431 {
432 "status": "OK",
433 "series": [
434 {"values": random_values, "name": "ubuntu/0.1"}
435 ],
436 "buckets": dates,
437 "metric_name": "weekly_installed_base_by_operating_system",
438 },
439 {
440 "status": "OK",
441 "series": countries,
442 "buckets": ["2018-03-18"],
443 "metric_name": "weekly_installed_base_by_country",
444 },
445 ]
446 }
447 responses.add(responses.POST, self.api_url, json=payload, status=200)
449 response = self.client.get(
450 self.endpoint_url + "?period=30d&active-devices=os"
451 )
453 self.assertEqual(3, len(responses.calls))
454 called = responses.calls[0]
455 self.assertEqual(self.info_url, called.request.url)
456 self.assertEqual(
457 self.authorization, called.request.headers.get("Authorization")
458 )
459 called = responses.calls[1]
460 self.assertEqual(self.api_url, called.request.url)
461 self.assertEqual(
462 self.authorization, called.request.headers.get("Authorization")
463 )
465 self.assertEqual(response.status_code, 200)
466 self.assert_template_used("publisher/metrics.html")
467 self.assert_context("snap_name", self.snap_name)
468 self.assert_context("snap_title", "Test Snap")
469 self.assert_context("metric_period", "30d")
470 self.assert_context("active_device_metric", "os")
471 self.assert_context("nodata", False)
473 @responses.activate
474 def test_data_os_3_month(self):
475 random_values = random.sample(range(1, 100), 59)
476 dates = []
477 for month in range(4, 7):
478 dates = dates + [
479 datetime(2018, month, day).strftime("%Y-%m-%d")
480 for day in range(1, 30)
481 ]
483 countries = [
484 {"values": [2], "name": "FR"},
485 {"values": [3], "name": "GB"},
486 ]
487 payload = {
488 "metrics": [
489 {
490 "status": "OK",
491 "series": [
492 {"values": random_values, "name": "ubuntu/0.1"}
493 ],
494 "buckets": dates,
495 "metric_name": "weekly_installed_base_by_operating_system",
496 },
497 {
498 "status": "OK",
499 "series": countries,
500 "buckets": ["2018-03-18"],
501 "metric_name": "weekly_installed_base_by_country",
502 },
503 ]
504 }
505 responses.add(responses.POST, self.api_url, json=payload, status=200)
507 response = self.client.get(
508 self.endpoint_url + "?period=3m&active-devices=os"
509 )
511 self.assertEqual(3, len(responses.calls))
512 called = responses.calls[0]
513 self.assertEqual(self.info_url, called.request.url)
514 self.assertEqual(
515 self.authorization, called.request.headers.get("Authorization")
516 )
517 called = responses.calls[1]
518 self.assertEqual(self.api_url, called.request.url)
519 self.assertEqual(
520 self.authorization, called.request.headers.get("Authorization")
521 )
523 self.assertEqual(response.status_code, 200)
524 self.assert_template_used("publisher/metrics.html")
525 self.assert_context("snap_name", self.snap_name)
526 self.assert_context("snap_title", "Test Snap")
527 self.assert_context("metric_period", "3m")
528 self.assert_context("active_device_metric", "os")
529 self.assert_context("nodata", False)