【问题标题】:Test for removed permission implemented in form_valid() in Django测试在 Django 中的 form_valid() 中实现的已删除权限
【发布时间】:2021-11-27 22:32:36
【问题描述】:

我不明白为什么我的测试没有通过。我使用了this answer 中提到的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

【问题讨论】:

    标签: python django django-testing


    【解决方案1】:

    您的测试对象权限不正确

    根据您的设置:

    # 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'
    

    这将允许该测试用户访问此资源。如果您希望他们不访问您需要的资源,请从设置中删除此权限。

    【讨论】:

    • 我想授予新用户添加一条记录和扩展一条添加记录的权限。所以我在创建用户时设置了这些权限。然后,在他们第一次提交后,我需要删除权限。
    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多