|
25 | 25 | AllowIfNotMozillaDisabled, |
26 | 26 | AllowIfPublic, |
27 | 27 | AllowListedViewerOrReviewer, |
| 28 | + AllowListedViewerOrReviewerReadOnly, |
28 | 29 | AllowNone, |
29 | 30 | AllowOwner, |
30 | 31 | AllowReadOnlyIfPublic, |
31 | 32 | AllowRelatedObjectPermissions, |
32 | 33 | AllowUnlistedViewerOrReviewer, |
| 34 | + AllowUnlistedViewerOrReviewerReadOnly, |
33 | 35 | AnyOf, |
34 | 36 | ByHttpMethod, |
35 | 37 | GroupPermission, |
@@ -415,6 +417,67 @@ def test_no_listed_version_reviewer(self): |
415 | 417 | assert not self.permission.has_object_permission(request, myview, obj) |
416 | 418 |
|
417 | 419 |
|
| 420 | +class TestAllowListedViewerOrReviewerReadOnly(TestAllowListedViewerOrReviewer): |
| 421 | + """Similar to AllowListedViewerOrReviewer, but restricted to safe methods.""" |
| 422 | + |
| 423 | + def setUp(self): |
| 424 | + super().setUp() |
| 425 | + self.permission = AllowListedViewerOrReviewerReadOnly() |
| 426 | + |
| 427 | + def test_admin(self): |
| 428 | + user = user_factory() |
| 429 | + self.grant_permission(user, '*:*') |
| 430 | + obj = Mock(spec=[]) |
| 431 | + obj.type = amo.ADDON_EXTENSION |
| 432 | + obj.has_listed_versions = lambda include_deleted=False: True |
| 433 | + |
| 434 | + for method in self.safe_methods: |
| 435 | + request = getattr(self.request_factory, method)('/') |
| 436 | + request.user = user |
| 437 | + assert self.permission.has_permission(request, myview) |
| 438 | + assert self.permission.has_object_permission(request, myview, obj) |
| 439 | + |
| 440 | + for method in self.unsafe_methods: |
| 441 | + request = getattr(self.request_factory, method)('/') |
| 442 | + request.user = user |
| 443 | + assert self.permission.has_permission(request, myview) |
| 444 | + assert not self.permission.has_object_permission(request, myview, obj) |
| 445 | + |
| 446 | + def test_addon_reviewer(self): |
| 447 | + user = user_factory() |
| 448 | + self.grant_permission(user, 'Addons:Review') |
| 449 | + obj = Mock(spec=[]) |
| 450 | + obj.type = amo.ADDON_EXTENSION |
| 451 | + obj.has_listed_versions = lambda include_deleted=False: True |
| 452 | + |
| 453 | + for method in self.safe_methods: |
| 454 | + request = getattr(self.request_factory, method)('/') |
| 455 | + request.user = user |
| 456 | + assert self.permission.has_object_permission(request, myview, obj) |
| 457 | + |
| 458 | + for method in self.unsafe_methods: |
| 459 | + request = getattr(self.request_factory, method)('/') |
| 460 | + request.user = user |
| 461 | + assert not self.permission.has_object_permission(request, myview, obj) |
| 462 | + |
| 463 | + def test_theme_reviewer(self): |
| 464 | + user = user_factory() |
| 465 | + self.grant_permission(user, 'Addons:ThemeReview') |
| 466 | + obj = Mock(spec=[]) |
| 467 | + obj.type = amo.ADDON_STATICTHEME |
| 468 | + obj.has_listed_versions = lambda include_deleted=False: True |
| 469 | + |
| 470 | + for method in self.safe_methods: |
| 471 | + request = getattr(self.request_factory, method)('/') |
| 472 | + request.user = user |
| 473 | + assert self.permission.has_object_permission(request, myview, obj) |
| 474 | + |
| 475 | + for method in self.unsafe_methods: |
| 476 | + request = getattr(self.request_factory, method)('/') |
| 477 | + request.user = user |
| 478 | + assert not self.permission.has_object_permission(request, myview, obj) |
| 479 | + |
| 480 | + |
418 | 481 | class TestAllowAnyKindOfReviewer(TestCase): |
419 | 482 | # Note: be careful when testing, under the hood we're using a method that |
420 | 483 | # relies on UserProfile.groups_list, which is cached on the UserProfile |
@@ -587,6 +650,47 @@ def test_object_with_no_unlisted_versions_and_no_listed_versions_viewer(self): |
587 | 650 | assert self.permission.has_object_permission(self.request, myview, obj) |
588 | 651 |
|
589 | 652 |
|
| 653 | +class TestAllowUnlistedViewerOrReviewerReadOnly(TestAllowUnlistedViewerOrReviewer): |
| 654 | + """Similar to AllowUnlistedViewerOrReviewer, but restricted to safe methods.""" |
| 655 | + |
| 656 | + def setUp(self): |
| 657 | + super().setUp() |
| 658 | + self.permission = AllowUnlistedViewerOrReviewerReadOnly() |
| 659 | + |
| 660 | + def test_admin(self): |
| 661 | + self.request.user = user_factory() |
| 662 | + self.grant_permission(self.request.user, '*:*') |
| 663 | + obj = Mock(spec=[]) |
| 664 | + obj.has_unlisted_versions = lambda include_deleted=False: True |
| 665 | + |
| 666 | + assert self.permission.has_permission(self.request, myview) |
| 667 | + assert not self.permission.has_object_permission(self.request, myview, obj) |
| 668 | + self.request.method = 'GET' |
| 669 | + assert self.permission.has_object_permission(self.request, myview, obj) |
| 670 | + |
| 671 | + def test_unlisted_reviewer(self): |
| 672 | + self.request.user = user_factory() |
| 673 | + self.grant_permission(self.request.user, 'Addons:ReviewUnlisted') |
| 674 | + obj = Mock(spec=[]) |
| 675 | + obj.has_unlisted_versions = lambda include_deleted=False: True |
| 676 | + |
| 677 | + assert self.permission.has_permission(self.request, myview) |
| 678 | + assert not self.permission.has_object_permission(self.request, myview, obj) |
| 679 | + self.request.method = 'GET' |
| 680 | + assert self.permission.has_object_permission(self.request, myview, obj) |
| 681 | + |
| 682 | + def test_object_with_no_unlisted_versions_and_no_listed_versions(self): |
| 683 | + self.request.user = user_factory() |
| 684 | + self.grant_permission(self.request.user, 'Addons:ReviewUnlisted') |
| 685 | + obj = Mock(spec=[]) |
| 686 | + obj.has_unlisted_versions = lambda include_deleted=False: False |
| 687 | + obj.has_listed_versions = lambda include_deleted=False: False |
| 688 | + assert self.permission.has_permission(self.request, myview) |
| 689 | + assert not self.permission.has_object_permission(self.request, myview, obj) |
| 690 | + self.request.method = 'GET' |
| 691 | + assert self.permission.has_object_permission(self.request, myview, obj) |
| 692 | + |
| 693 | + |
590 | 694 | class TestAllowIfPublic(TestCase): |
591 | 695 | def setUp(self): |
592 | 696 | self.permission = AllowIfPublic() |
|
0 commit comments