Тестирование API-интерфейса Django Rest Framework с аутентификацией по токену и разрешением isAdmin, возвращающим 403, Ошибка утверждения

#django #unit-testing #testing #django-rest-framework #django-testing

Вопрос:

добрые люди, я впервые пишу тестовые примеры для своего API-интерфейса django rest framework. Я использовал аутентификацию по токену и разрешение администратора. Я написал несколько тестов конечных точек api. Тесты работают нормально без аутентификации. Я также сделал это в POSTMAN, и с предоставлением авторизации токенов в заголовках там все работает нормально. Но всякий раз, когда я запускаю модульные тесты с аутентификацией по токену и разрешением администратора, он возвращает мне 403, ошибку утверждения. Я застрял с этим на последние два дня. Кто-нибудь может, пожалуйста, помочь мне понять, где я делаю что-то не так?

Я предоставляю свой код ниже: Моя модель:

 class Vendor(models.Model):
    user = models.ForeignKey(MyUser, on_delete=models.CASCADE, related_name='myuser')
    vendor_name = models.CharField(max_length=100)
    vendor_type = models.CharField(max_length=100, choices=Vendor_Type)
    display_name = models.CharField(max_length=100)
    vendor_mail = models.CharField(max_length=255)
    vendor_phone = models.CharField(max_length=15)
    vendor_address = models.CharField(max_length=255)

    def __str__(self):
        return self.display_name
 

Мой сериализатор:

 class VendorSerializer(serializers.ModelSerializer):

    address_details = VendorAddressDetailSerializer(read_only=True, source='detaisaddress')
    sales_person = VendorContactSerializer(read_only=True, source='contactperson')
    social_account = VendorSocialSerializer(read_only=True, source='vendorsocial')
    class Meta:
        model = Vendor
        fields = ['id','vendor_name', 'vendor_type', 'display_name', 'vendor_mail', 'vendor_phone','vendor_address', 'user', 'address_details', 'sales_person', 'social_account']
 

Мой взгляд:

 class VendorViewSet(viewsets.ModelViewSet):
    queryset = Vendor.objects.all()
    serializer_class = VendorSerializer
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAdminUser]
 

Шаблоны URL-адресов:

 router = DefaultRouter()
router.register('vendors', VendorViewSet, basename='vendors')

urlpatterns = [
    path('', include(router.urls)),
]
 

И, наконец, мой код тестового примера:

 class TestSetUp(APITestCase):
    email = "zzm@abcd.com"
    phone = "0122xxxxxxx"
    name = "zzm"
    address = "zzmkk"
    password = "1234xxxx"

    def setUp(self):
        self.user = MyUser.objects.create_user(self.email, self.phone, self.name, self.address, self.password)
        self.user.is_admin = True
        self.user.save()
        self.token = Token.objects.get(user=self.user)

        self.vendor_url = reverse('vendors-list')


    self.my_dummy_user = {
            "email": "temp@gmail.com",
            "phone": "01222xxx",
            "name": "temp",
            "address": "tempxx",
            "password": "1234xxxxx",
        }


    def _create_my_user(self):
        my_user = MyUser.objects.create_user(
            **self.my_dummy_user,
        )
        my_user.is_admin = True
        my_user.is_superuser = True
        my_user.save()
        return {
            "my_user": my_user,
        }

    def test_vendor_post_201(self):
        data = self._create_my_user()
        token = Token.objects.get(user__name= data.get('my_user').name)
        vendor_data = {
            "vendor_name": "lama",
            "vendor_type": "person",
            "display_name": "lama co",
            "vendor_mail": "lama@gmail.com",
            "vendor_phone": "0133xxxxx",
            "vendor_address": "xxxxxxxxx",
            "user": data.get('my_user').id
        }
        client = APIClient()
        client.credentials(HTTP_AUTHORIZATION='Token '   token.key)
        # headers = {'Authorization': 'token '   token.key}
        res = client.post(self.vendor_url, vendor_data, format="json")
        self.assertEqual(res.status_code, 201)
        return res.data
 

Продвигайтесь вперед благодаря добрым душам. Это было бы большим подспорьем для меня.

Ответ №1:

Спасибо вам, кто столкнулся и попытался ответить на мой вопрос. Но я понял, что использовал разрешение InAdmin, Поэтому пользователи с правами администратора могут публиковать сообщение в django, чтобы предоставить пользователю разрешение администратора, должно сделать следующее: is_stuff=True нет is_admin=True . поэтому моя пользовательская функция по умолчанию должна выглядеть так:

 def _create_my_user(self):
        my_user = MyUser.objects.create_user(
            **self.my_dummy_user,
        )
        my_user.is_stuff = True
        my_user.save()
        return {
            "my_user": my_user,
        }