Юнит-тесты Django, пользовательское разрешение и request.user.username - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно ограничить доступ к API, которые я определил в своем представлении. Вот мой views.py:

rom rest_framework import generics
from rest_framework import permissions
from .serializers import LocationSerializer, PartSerializer, PartLocationSerializer, SiteSerializer
from .models import Location, Part, PartLocation, Site, SPIUser


class SPIPermission(permissions.BasePermission):
    """
    blah blah blah ...
    """
    def has_permission(self, request, view):
        try:
            username = request.user.username
            SPIUser.objects.get(username=username)
        except SPIUser.DoesNotExist:
            return False
        if not request.user.is_authenticated:
            return False
        return True


class LocationList(generics.ListCreateAPIView):
    # using get_queryset().order_by('id') prevents UnorderedObjectListWarning
    queryset = Location.objects.get_queryset().order_by('id')
    serializer_class = LocationSerializer
    permission_classes = (SPIPermission,)

Я хочу продемонстрировать в своих модульных тестах, что вы должны быть SPIUser, чтобы иметь доступ к этим конечным точкам API, поэтому я пишу простой модульный тест, например:

from .models import Location, Part, PartLocation, Site, SPIUser
from .urls import urlpatterns
from my.APITestCase import RemoteAuthenticatedTest
from django.db.models import ProtectedError
from django.test import TransactionTestCase
from django.urls import reverse
from rest_framework import status
import django.db.utils
import os


class ViewTestCases(RemoteAuthenticatedTest):

    def test_spi_permission(self):

        url = reverse('spi:locationlist')
        response = self.client.get(url)
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
        SPIUser.objects.create(username=self.username)
        response = self.client.get(url)
        self.assertNotEquals(response.status_code, status.HTTP_403_FORBIDDEN)

Этот тест не пройден с сообщением об ошибке:

Failure
Traceback (most recent call last):
  File "/apps/man/apman/spi/tests.py", line 21, in test_spi_permission
    self.assertNotEquals(response.status_code, status.HTTP_403_FORBIDDEN)
AssertionError: 403 == 403

Я заметил, что строка в has_permission ...

username = request.user.username

... всегда устанавливает username в ''. Так что has_permission всегда будет возвращать False.

Мой модульный тест ViewTestCases наследует класс RemoteAuthenticatedTest, который определен так:

from rest_framework.test import APIClient,APITestCase
from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token


class RemoteAuthenticatedTest(APITestCase):
    client_class = APIClient

    def setUp(self):
        self.username = 'mister_neutron'
        self.password = 'XXXXXXXXXXX'
        self.user = User.objects.create_user(username= self.username,
                                             email='mister_neutron@example.com',
                                             password=self.password)
        #authentication user
        self.client.login(username=self.username, password=self.password)
        Token.objects.create(user=self.user)
        super(RemoteAuthenticatedTest, self).setUp()

Поэтому я подумал, что request.user.username будет mister_neutron. Что я здесь не так делаю?

1 Ответ

0 голосов
/ 12 июня 2019

Ах, черт возьми. Я забыл, что я использую аутентификацию RemoteUser, поэтому, когда я делаю свою, мне нужно установить REMOTE_USER примерно так:

        response = self.client.get(url, REMOTE_USER=self.username)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...