|
3 | 3 | import pytest
|
4 | 4 |
|
5 | 5 | from django import test
|
| 6 | +from django.contrib.auth.models import Permission |
6 | 7 | from django.test.utils import override_settings
|
7 | 8 | from django.core.exceptions import ImproperlyConfigured, PermissionDenied
|
8 | 9 | from django.http import Http404, HttpResponse
|
|
11 | 12 |
|
12 | 13 | from django.urls import reverse_lazy
|
13 | 14 |
|
14 |
| -from .factories import GroupFactory, UserFactory |
| 15 | +from .factories import GroupFactory, UserFactory, UserObjectPermissionsFactory, ArticleFactory |
15 | 16 | from .helpers import TestViewHelper
|
16 | 17 | from .views import (
|
17 | 18 | PermissionRequiredView,
|
@@ -413,6 +414,50 @@ def test_invalid_permission(self):
|
413 | 414 | with self.assertRaises(ImproperlyConfigured):
|
414 | 415 | self.dispatch_view(self.build_request(), permission_required=None)
|
415 | 416 |
|
| 417 | + def test_object_level_permissions(self): |
| 418 | + """ |
| 419 | + Tests that object level permissions perform as expected, where object level permissions and |
| 420 | + global level permissions |
| 421 | + """ |
| 422 | + # Arrange |
| 423 | + article = ArticleFactory() |
| 424 | + self.view_class = PermissionRequiredView |
| 425 | + self.view_url = f"/object_level_permission_required/?pk={article.pk}" |
| 426 | + tests_add_article = Permission.objects.get(codename="add_article") |
| 427 | + permissions = "tests.add_article" |
| 428 | + valid_user = UserFactory(permissions=[permissions]) |
| 429 | + invalid_user_1 = UserFactory(permissions=["auth.add_user"]) |
| 430 | + invalid_user_2 = UserFactory(permissions=[permissions]) |
| 431 | + UserObjectPermissionsFactory( |
| 432 | + user=valid_user, permission=tests_add_article, article_object=article |
| 433 | + ) |
| 434 | + # Act |
| 435 | + valid_req = self.build_request(path=self.view_url, user=valid_user) |
| 436 | + valid_resp = self.dispatch_view( |
| 437 | + valid_req, |
| 438 | + permission_required=permissions, |
| 439 | + object_level_permissions=True, |
| 440 | + raise_exception=True |
| 441 | + ) |
| 442 | + invalid_req_1 = self.build_request(path=self.view_url, user=invalid_user_1) |
| 443 | + invalid_req_2 = self.build_request(path=self.view_url, user=invalid_user_2) |
| 444 | + # Assert |
| 445 | + self.assertEqual(valid_resp.status_code, 200) |
| 446 | + with self.assertRaises(PermissionDenied): |
| 447 | + self.dispatch_view( |
| 448 | + invalid_req_1, |
| 449 | + permission_required=permissions, |
| 450 | + object_level_permissions=True, |
| 451 | + raise_exception=True |
| 452 | + ) |
| 453 | + with self.assertRaises(PermissionDenied): |
| 454 | + self.dispatch_view( |
| 455 | + invalid_req_2, |
| 456 | + permission_required=permissions, |
| 457 | + object_level_permissions=True, |
| 458 | + raise_exception=True |
| 459 | + ) |
| 460 | + |
416 | 461 |
|
417 | 462 | @pytest.mark.django_db
|
418 | 463 | class TestMultiplePermissionsRequiredMixin(
|
@@ -534,6 +579,69 @@ def test_any_permissions_key(self):
|
534 | 579 | permissions=permissions,
|
535 | 580 | )
|
536 | 581 |
|
| 582 | + def test_all_object_level_permissions_key(self): |
| 583 | + """ |
| 584 | + Tests that when a user has all the correct object level permissions, response is OK, |
| 585 | + else forbidden. |
| 586 | + """ |
| 587 | + # Arrange |
| 588 | + article = ArticleFactory() |
| 589 | + self.view_class = MultiplePermissionsRequiredView |
| 590 | + self.view_url = f"/multiple_object_level_permissions_required/?pk={article.pk}" |
| 591 | + auth_add_user = Permission.objects.get(codename="add_user") |
| 592 | + tests_add_article = Permission.objects.get(codename="add_article") |
| 593 | + permissions = {"all": ["auth.add_user", "tests.add_article"]} |
| 594 | + valid_user = UserFactory(permissions=permissions["all"]) |
| 595 | + invalid_user = UserFactory(permissions=["auth.add_user"]) |
| 596 | + UserObjectPermissionsFactory(user=valid_user, permission=auth_add_user, article_object=article) |
| 597 | + UserObjectPermissionsFactory(user=valid_user, permission=tests_add_article, article_object=article) |
| 598 | + # Act |
| 599 | + valid_req = self.build_request(path=self.view_url, user=valid_user) |
| 600 | + valid_resp = self.dispatch_view( |
| 601 | + valid_req, permissions=permissions, object_level_permissions=True |
| 602 | + ) |
| 603 | + invalid_req = self.build_request(path=self.view_url, user=invalid_user) |
| 604 | + # Arrange |
| 605 | + self.assertEqual(valid_resp.status_code, 200) |
| 606 | + with self.assertRaises(PermissionDenied): |
| 607 | + self.dispatch_view( |
| 608 | + invalid_req, permissions=permissions, object_level_permissions=True, raise_exception=True |
| 609 | + ) |
| 610 | + |
| 611 | + def test_any_object_level_permissions_key(self): |
| 612 | + """ |
| 613 | + Tests that when a user has any the correct object level permissions, response is OK, |
| 614 | + else forbidden. |
| 615 | + """ |
| 616 | + # Arrange |
| 617 | + article = ArticleFactory() |
| 618 | + self.view_url = f"/multiple_object_level_permissions_required/?pk={article.pk}" |
| 619 | + self.view_class = MultiplePermissionsRequiredView |
| 620 | + auth_add_user = Permission.objects.get(codename="add_user") |
| 621 | + tests_add_article = Permission.objects.get(codename="add_article") |
| 622 | + permissions = {"any": ["auth.add_user", "tests.add_article"]} |
| 623 | + user = UserFactory(permissions=[permissions["any"][0]]) |
| 624 | + user_1 = UserFactory() |
| 625 | + user_2 = UserFactory(permissions=permissions["any"]) |
| 626 | + UserObjectPermissionsFactory(user=user, permission=auth_add_user, article_object=article) |
| 627 | + UserObjectPermissionsFactory(user=user, permission=tests_add_article, article_object=article) |
| 628 | + # Act |
| 629 | + valid_req = self.build_request(path=self.view_url, user=user) |
| 630 | + valid_resp = self.dispatch_view( |
| 631 | + valid_req, permissions=permissions, object_level_permissions=True, raise_exception=True |
| 632 | + ) |
| 633 | + invalid_req_1 = self.build_request(path=self.view_url, user=user_1) |
| 634 | + invalid_req_2 = self.build_request(path=self.view_url, user=user_2) |
| 635 | + # Assert |
| 636 | + self.assertEqual(valid_resp.status_code, 200) |
| 637 | + with self.assertRaises(PermissionDenied): |
| 638 | + self.dispatch_view( |
| 639 | + invalid_req_1, permissions=permissions, object_level_permissions=True, raise_exception=True |
| 640 | + ) |
| 641 | + with self.assertRaises(PermissionDenied): |
| 642 | + self.dispatch_view(invalid_req_2, permissions=permissions, object_level_permissions=True, raise_exception=True) |
| 643 | + |
| 644 | + |
537 | 645 |
|
538 | 646 | @pytest.mark.django_db
|
539 | 647 | class TestSuperuserRequiredMixin(_TestAccessBasicsMixin, test.TestCase):
|
|
0 commit comments