|
12 | 12 |
|
13 | 13 | from .. import settings as app_settings |
14 | 14 | from ..base.base import logger as base_config_logger |
15 | | -from ..controller.views import DeviceChecksumView |
| 15 | +from ..controller.views import DeviceChecksumView, VpnChecksumView |
16 | 16 | from ..controller.views import logger as controller_views_logger |
17 | 17 | from ..signals import ( |
18 | 18 | checksum_requested, |
19 | 19 | config_download_requested, |
20 | 20 | config_modified, |
21 | 21 | config_status_changed, |
22 | 22 | device_registered, |
| 23 | + vpn_server_modified, |
23 | 24 | ) |
24 | 25 | from .utils import CreateConfigTemplateMixin, TestVpnX509Mixin |
25 | 26 |
|
@@ -365,11 +366,20 @@ def test_device_download_config_405(self): |
365 | 366 | self.assertEqual(response.status_code, 405) |
366 | 367 |
|
367 | 368 | def test_vpn_checksum(self): |
368 | | - v = self._create_vpn() |
369 | | - url = reverse("controller:vpn_checksum", args=[v.pk]) |
370 | | - response = self.client.get(url, {"key": v.key}) |
371 | | - self.assertEqual(response.content.decode(), v.checksum) |
372 | | - self._check_header(response) |
| 369 | + vpn = self._create_vpn() |
| 370 | + url = reverse("controller:vpn_checksum", args=[vpn.pk]) |
| 371 | + |
| 372 | + with self.subTest("First request will calculate the checksum"): |
| 373 | + with self.assertNumQueries(3): |
| 374 | + response = self.client.get(url, {"key": vpn.key}) |
| 375 | + self.assertEqual(response.content.decode(), vpn.checksum) |
| 376 | + self._check_header(response) |
| 377 | + |
| 378 | + with self.subTest("Second request will return cached checksum"): |
| 379 | + with self.assertNumQueries(0): |
| 380 | + response = self.client.get(url, {"key": vpn.key}) |
| 381 | + self.assertEqual(response.content.decode(), vpn.checksum) |
| 382 | + self._check_header(response) |
373 | 383 |
|
374 | 384 | def test_vpn_checksum_bad_uuid(self): |
375 | 385 | v = self._create_vpn() |
@@ -408,6 +418,49 @@ def test_vpn_checksum_org_disabled(self): |
408 | 418 | vpn, reverse("controller:vpn_checksum", args=[vpn.pk]) |
409 | 419 | ) |
410 | 420 |
|
| 421 | + def test_vpn_get_object_cached(self): |
| 422 | + vpn = self._create_vpn() |
| 423 | + view = VpnChecksumView() |
| 424 | + view.kwargs = {"pk": str(vpn.pk)} |
| 425 | + |
| 426 | + with self.subTest("check cache set"): |
| 427 | + with patch("django.core.cache.cache.set") as mock: |
| 428 | + self.assertEqual(view.get_vpn(), vpn) |
| 429 | + mock.assert_called_once() |
| 430 | + |
| 431 | + with self.subTest("check cache get"): |
| 432 | + with patch("django.core.cache.cache.get", return_value=vpn) as mock: |
| 433 | + view.get_vpn() |
| 434 | + mock.assert_called_once() |
| 435 | + |
| 436 | + with self.subTest("check cache invalidation"): |
| 437 | + with patch("django.core.cache.cache.delete") as mock: |
| 438 | + view.get_vpn.invalidate(view) |
| 439 | + mock.assert_called_once() |
| 440 | + |
| 441 | + def test_vpn_checksum_cache_invalidation_handler(self): |
| 442 | + vpn = self._create_vpn() |
| 443 | + url = reverse("controller:vpn_checksum", args=[vpn.pk]) |
| 444 | + # Warm up the cache |
| 445 | + with self.assertNumQueries(1): |
| 446 | + response = self.client.get(url, {"key": vpn.key}) |
| 447 | + self.assertEqual(response.content.decode(), vpn.checksum) |
| 448 | + |
| 449 | + # Cache works are expected |
| 450 | + with self.assertNumQueries(0): |
| 451 | + response = self.client.get(url, {"key": vpn.key}) |
| 452 | + self.assertEqual(response.content.decode(), vpn.checksum) |
| 453 | + |
| 454 | + # Change VPN config to trigger invalidation |
| 455 | + vpn.config["openvpn"][0]["proto"] = "tcp-server" |
| 456 | + vpn.full_clean() |
| 457 | + vpn.save() |
| 458 | + |
| 459 | + del vpn.backend_instance |
| 460 | + with self.assertNumQueries(1): |
| 461 | + response = self.client.get(url, {"key": vpn.key}) |
| 462 | + self.assertEqual(response.content.decode(), vpn.checksum) |
| 463 | + |
411 | 464 | def test_vpn_download_config(self): |
412 | 465 | v = self._create_vpn() |
413 | 466 | url = reverse("controller:vpn_download_config", args=[v.pk]) |
|
0 commit comments