11from unittest .mock import MagicMock , patch
22
33from 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
65from django .core .exceptions import ImproperlyConfigured
76from django .test import TestCase
87from django .urls import reverse
2221)
2322from . import AdminTestMixin , CreateMixin
2423
25- User = get_user_model ()
26-
2724
2825class 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