|
1 | 1 | # Copyright (c) 2022 LINE Corporation |
2 | 2 | # These sources are released under the terms of the MIT license: see LICENSE |
| 3 | +from unittest import mock |
| 4 | + |
3 | 5 | from django.urls import reverse |
4 | 6 | from guardian.shortcuts import assign_perm, remove_perm |
5 | 7 |
|
@@ -285,3 +287,71 @@ def test_merge_users_no_permissions(self): |
285 | 287 | reverse("admin:login") + "?next=" + reverse("admin:user-merge"), |
286 | 288 | "Non-admin user redirected to login page", |
287 | 289 | ) |
| 290 | + |
| 291 | + @mock.patch("promgen.models.Audit.log") |
| 292 | + @mock.patch("promgen.signals.trigger_write_config.send") |
| 293 | + def test_register_exporter(self, log_mock, write_mock): |
| 294 | + self.force_login(username="demo") |
| 295 | + assign_perm("project_editor", self.user, models.Project.objects.get(pk=1)) |
| 296 | + |
| 297 | + # Check creating an exporter with just the required fields and no path |
| 298 | + response = self.client.post( |
| 299 | + reverse("project-exporter", kwargs={"pk": 1}), |
| 300 | + {"job": "node", "port": 9101, "scheme": "http"}, |
| 301 | + ) |
| 302 | + self.assertEqual( |
| 303 | + response.status_code, 302, msg="Exporter created successfully without path" |
| 304 | + ) |
| 305 | + |
| 306 | + # Check successfully creating an exporter with query parameters in the path |
| 307 | + response = self.client.post( |
| 308 | + reverse("project-exporter", kwargs={"pk": 1}), |
| 309 | + { |
| 310 | + "job": "node", |
| 311 | + "port": 9101, |
| 312 | + "scheme": "http", |
| 313 | + "path": "/metrics?param1=foo¶m2=bar", |
| 314 | + }, |
| 315 | + ) |
| 316 | + self.assertEqual(response.status_code, 302) |
| 317 | + self.assertTrue( |
| 318 | + models.Exporter.objects.filter( |
| 319 | + path="/metrics?param1=foo¶m2=bar", |
| 320 | + ).exists(), |
| 321 | + "Exporter with query parameters in path created successfully", |
| 322 | + ) |
| 323 | + |
| 324 | + # Check creating an exporter with array query parameter should not be allowed |
| 325 | + response = self.client.post( |
| 326 | + reverse("project-exporter", kwargs={"pk": 1}), |
| 327 | + { |
| 328 | + "job": "node", |
| 329 | + "port": 9101, |
| 330 | + "scheme": "http", |
| 331 | + "path": "/metrics?list[]=foo&list[]=bar", |
| 332 | + }, |
| 333 | + ) |
| 334 | + self.assertEqual(response.status_code, 200, msg="Exporter created failed") |
| 335 | + self.assertEqual( |
| 336 | + response.context_data["form"].errors, |
| 337 | + {"path": ["List values are currently not supported for query parameters."]}, |
| 338 | + msg="Exporter with array query parameters should not be allowed", |
| 339 | + ) |
| 340 | + |
| 341 | + # Check creating an exporter with redundant query parameters should be cleaned up |
| 342 | + response = self.client.post( |
| 343 | + reverse("project-exporter", kwargs={"pk": 1}), |
| 344 | + { |
| 345 | + "job": "node", |
| 346 | + "port": 9101, |
| 347 | + "scheme": "http", |
| 348 | + "path": "/metrics?param=value¶m¶m=", |
| 349 | + }, |
| 350 | + ) |
| 351 | + self.assertEqual(response.status_code, 302) |
| 352 | + self.assertTrue( |
| 353 | + models.Exporter.objects.filter( |
| 354 | + path="/metrics?param=value", |
| 355 | + ).exists(), |
| 356 | + "Redundant query parameters should be cleaned up and exporter created successfully", |
| 357 | + ) |
0 commit comments