Skip to content

Commit de1376f

Browse files
committed
[fix] Added negative case for cascade delete permission #256
Added a subTest to verify that cascade deletes still respect child-model permissions. Fixes #256
1 parent 5242e19 commit de1376f

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

tests/test_project/tests/test_admin.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from unittest.mock import MagicMock, patch
22

33
from django.contrib.admin.sites import AdminSite
4-
from django.contrib.auth import get_user_model
5-
from django.contrib.auth.models import Permission
4+
from django.contrib.auth.models import Permission, User
65
from django.core.exceptions import ImproperlyConfigured
76
from django.test import TestCase
87
from django.urls import reverse
@@ -22,8 +21,6 @@
2221
)
2322
from . import AdminTestMixin, CreateMixin
2423

25-
User = get_user_model()
26-
2724

2825
class TestAdmin(AdminTestMixin, CreateMixin, TestCase):
2926
TEST_KEY = "w1gwJxKaHcamUw62TQIPgYchwLKn3AA0"
@@ -135,6 +132,13 @@ def test_readonlyadmin_has_delete_permission(self):
135132
).wsgi_request
136133
self.assertFalse(modeladmin.has_delete_permission(request))
137134

135+
with self.subTest("delete URL returns False"):
136+
obj = self._create_radius_accounting(username="delete-test", session_id="2")
137+
request = self.client.get(
138+
reverse("admin:test_project_radiusaccounting_delete", args=[obj.pk])
139+
).wsgi_request
140+
self.assertFalse(modeladmin.has_delete_permission(request))
141+
138142
with self.subTest("cascade delete from unrelated URL returns True"):
139143
# Simulate being called from a parent model's delete
140144
# confirmation (cascade), not from the model's own views.
@@ -153,6 +157,21 @@ def test_readonlyadmin_has_delete_permission(self):
153157
request.resolver_match = None
154158
self.assertTrue(modeladmin.has_delete_permission(request))
155159

160+
with self.subTest("cascade delete without child permission returns False"):
161+
user = User.objects.create(
162+
username="readonly-staff",
163+
password="pass",
164+
is_staff=True,
165+
is_superuser=False,
166+
)
167+
self.client.force_login(user)
168+
request = self.client.get(reverse("admin:index")).wsgi_request
169+
170+
mock_resolver = MagicMock()
171+
mock_resolver.url_name = "index"
172+
request.resolver_match = mock_resolver
173+
self.assertFalse(modeladmin.has_delete_permission(request))
174+
156175
def test_context_processor(self):
157176
url = reverse("admin:index")
158177
response = self.client.get(url)

0 commit comments

Comments
 (0)