Рекомендации по тестированию разрешений модели DRF с помощью TDD - PullRequest
0 голосов
/ 26 марта 2019

Я пишу DRF API для образовательного веб-сайта, где пользователи могут получать доступ к данным на основе групп разрешений и разрешений на уровне объектов, которые они имеют. Когда я начал писать тесты, я задумался, нужно ли тестировать запросы со всеми возможными комбинациями разрешений. Например, скажем, одна конечная точка API требует трех разрешений для предоставления доступа к своим данным, тогда вы можете написать множество методов тестирования, чтобы проверить все возможные комбинации разрешений, которые может иметь пользователь. Только одна комбинация, в которой у пользователя есть все три разрешения, приведет к получению данных, а остальная часть, скорее всего, приведет к 403 Запрещенному ответу.

Например, тремя разрешениями могут быть что-то вроде IsAuthenticated, IsOwner и IsTeacher. У пользователя должны быть все три разрешения, поэтому комбинации 403 запрещенных ответов будут:

IsOwner    IsAuthenticated    IsTeacher
False      False              False,
False      False              True,
False      True               True,
True       False              False,
True       True               False,
True       False              True,
False      True               False,

Действительный ответ, который дает пользователю доступ к данным, будет:

IsOwner    IsAuthenticated    IsTeacher
True       True               True

Нужно ли проверять их все? Должен ли я проверить это по-другому?

1 Ответ

0 голосов
/ 26 марта 2019

Вам не нужно тестировать все комбинации, хотя лучше охватить все тестовые случаи, если вы чувствуете, что так много нужно сделать.Вы можете сделать это в одном тестовом примере, как это.Вы можете изменить последовательность разрешений и написать новый регистр здесь, если хотите проверить все комбинации.

from rest_framework import status
from django.contrib.auth.models import Permission,User

class MyTest(APITestCase):
    client = APIClient()
    url = "/my/url/"

    def setUp(self):
            self.user = User.objects.create(username="hellouser")

    def test_user_permissions(self):
            res = self.client.post(self.url, data={"some": "data"}, format="json")
            self.assertEqual(res.status_code, status.HTTP_403_FORBIDDEN)
            #now give permission
            permission = Permission.objects.get(name='isOwner')
            self.user.user_permissions.add(permission) 
            res = self.client.post(self.url, data={"some": "data"}, format="json")
            self.assertEqual(res.status_code, status.HTTP_403_FORBIDDEN)
            #give another
            permission = Permission.objects.get(name='isTeacher')
            self.user.user_permissions.add(permission) 
            res = self.client.post(self.url, data={"some": "data"}, format="json")

            self.assertEqual(res.status_code, status.HTTP_403_FORBIDDEN)
            #last one should pass
            permission = Permission.objects.get(name='isAuthenticated')
            self.user.user_permissions.add(permission) 
            res = self.client.post(self.url, data={"some": "data"}, format="json")

            self.assertEqual(res.status_code, status.HTTP_200_OK)
...