Тест на снятие разрешения, реализованный в form_valid() в Django
Я не могу понять, почему мой тест не проходит. Я использовал RequestFactory
, как указано в этом ответе, который, к сожалению, оказался бесполезным для меня.
from io import BytesIO, StringIO
from django.contrib.auth.models import User, Permission
from django.test import TestCase, RequestFactory
from graph.views import NewRecord
class NewRecordViewTests(TestCase):
def setUp(self):
# Every test needs access to the request factory.
self.factory = RequestFactory()
self.user = User.objects.create_user(
username='jacob', email='jacob@example.com', password='top_secret')
permissions = [Permission.objects.get_by_natural_key('add_record', 'graph', 'record'), Permission.objects.get_by_natural_key('add_extend', 'graph', 'extend')]
self.user.user_permissions.set(permissions)
def test_user_permissions(self):
"""Tests that a user has been denied permission to add a record."""
for i in range(2):
img = BytesIO(b'mybinarydata')
fp = StringIO('Auxillary info')
img.name = 'myimage.jpg'
data = {'name': 'New Record',
'description': 'A new record',
'picture': img,
'content': 'Content',
'files': fp,
'author': self.user}
request = self.factory.post('/cascades/add', data=data)
request.user = self.user
response = NewRecord.as_view()(request)
self.assertEqual(response.status_code, 403, "Access should be denied")
self.assertFalse(self.user.has_perm('graph.add_record'), "Permission remains")
self.assertTrue(self.user.has_perm('graph.add_extend'), "No permission to extend a record")
Вывод:
======================================================================
FAIL: test_user_permissions (graph.tests.NewRecordViewTests)
Tests that a user has been denied permission to add a record.
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\pavel\Documents\repos\Artcascade\graph\tests.py", line 34, in test_user_permissions
self.assertEqual(response.status_code, 403, "Access should be denied")
AssertionError: 200 != 403 : Access should be denied
views.py:
class NewRecord(LoginRequiredMixin, PermissionRequiredMixin, SuccessMessageMixin, generic.CreateView):
model = Record
fields = ['name', 'description', 'picture', 'content', 'files']
permission_required = 'graph.add_record'
permission_denied_message = 'Purchase an access to add a record'
success_message = 'Record submitted.'
def form_valid(self, form):
form.instance.author = self.request.user
permission = Permission.objects.get_by_natural_key('add_record', 'graph', 'record')
form.instance.author.user_permissions.remove(permission)
if self.request.FILES:
form.instance.image = self.request.FILES['picture']
form.instance.files = self.request.FILES['files']
return super().form_valid(form)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['mode'] = 'add'
return context
Разрешения вашего тестового объекта неверны
Из вашей установки:
# notice graph.add_record is added here
permissions = [Permission.objects.get_by_natural_key('add_record', 'graph', 'record'), Permission.objects.get_by_natural_key('add_extend', 'graph', 'extend')]
self.user.user_permissions.set(permissions)
С вашей точки зрения:
# notice graph.add_record is required here
permission_required = 'graph.add_record'
Это позволит этому тестовому пользователю получить доступ к этому ресурсу. Если вы хотите, чтобы они НЕ имели доступа к ресурсу, вам нужно удалить это разрешение из настройки.