При тестировании вьюшки через pytest всегда не проходит тест test_login (ошибка 400) (Django, pytest)
При тестировании вьюшки через pytest всегда не проходит тест test_login (ошибка 400), однако при тестировании через postman или TestCase таких ошибок нет. В чем может быть проблема? Вот вьюшка:
from rest_framework import status, permissions
from rest_framework.exceptions import PermissionDenied
from rest_framework.response import Response
from rest_framework.decorators import action
from rest_framework.viewsets import GenericViewSet
from rest_framework.mixins import ListModelMixin
from django.contrib.auth import authenticate, login, logout
from .models import User
from .serializers import (
UserSerializer,
UserRegisterSerializer,
UserLoginSerializer,
UserLogoutSerializer,
UserChangeNameSerializer,
UserChangePasswordSerializer
)
import json
class UserViewSet(GenericViewSet, ListModelMixin):
queryset = User.objects.all()
permission_classes = [permissions.IsAdminUser]
serializer_class = UserSerializer
@action(
detail=False,
methods=["post"],
permission_classes=[permissions.AllowAny],
serializer_class=UserRegisterSerializer,
url_name="register"
)
def register(self, request):
username = request.data.get("username")
password = request.data.get("password")
email = request.data.get("email")
if not (username and password and email):
return Response(
{"message": "Missing required fields"},
status=status.HTTP_400_BAD_REQUEST,
)
if User.objects.filter(username=username).exists():
return Response(
{"message": "This username already exists"},
status=status.HTTP_400_BAD_REQUEST,
)
user = User.objects.create_user(
username=username, email=email, password=password
)
return Response(
{"message": "Successfully registered"}, status=status.HTTP_201_CREATED
)
# Авторизация пользователя
@action(
detail=False,
methods=["post"],
permission_classes=[permissions.AllowAny],
serializer_class=UserLoginSerializer,
)
def login(
self,
request
):
username = request.data.get("username")
password = request.data.get("password")
if not (username and password):
return Response(
{"message": "Missing required fields"},
status=status.HTTP_400_BAD_REQUEST,
)
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return Response({"message": "Successfully logged in"})
else:
return Response(
{"message": "Incorrect username or password"},
status=status.HTTP_400_BAD_REQUEST,
)
@action(
detail=False,
methods=["post"],
permission_classes=[permissions.IsAuthenticated],
serializer_class=UserLogoutSerializer,
)
def logout(self, request):
logout(request)
return Response({"message": "Exited successfully"})
@action(
detail=False,
methods=["post"],
permission_classes=[permissions.IsAuthenticated],
serializer_class=UserChangePasswordSerializer,
)
def change_password(
self,
request
):
user = request.user
if not user.check_password(request.data["password"]):
raise PermissionDenied("Incorrect password")
user.set_password(request.data["new_password"])
user.save()
return Response({"message": "Password successfully changed"})
@action(
detail=False,
methods=["post"],
permission_classes=[permissions.IsAuthenticated],
serializer_class=UserChangeNameSerializer,
)
def change_username(self, request):
user = request.user
if not user.check_password(request.data["password"]):
raise PermissionDenied("Incorrect password")
user.username = request.data["new_username"]
user.save()
return Response({"message": "Username successfully changed"})
Вот тесты:
import pytest
from django.urls import reverse
from rest_framework import status
from rest_framework.test import APIClient
from mixer.backend.django import mixer
from auth_app.models import User
from auth_app.views import UserViewSet
@pytest.fixture
def api_client():
return APIClient()
@pytest.fixture
def test_user():
return mixer.blend(User, username='testuser', password='testpassword')
@pytest.fixture
def test_admin():
return mixer.blend(User, username='testadmin', password='testpassword', is_staff=True)
@pytest.mark.django_db
def test_register(api_client):
url = reverse('auth-register')
data = {
'username': 'testuser',
'email': '[email protected]',
'password': 'testpassword'
}
response = api_client.post(url, data)
assert response.status_code == status.HTTP_201_CREATED
@pytest.mark.django_db
def test_register_existing_username(api_client, test_user):
url = reverse('auth-register')
data = {
'username': test_user.username,
'email': '[email protected]',
'password': 'testpassword'
}
response = api_client.post(url, data)
assert response.status_code == status.HTTP_400_BAD_REQUEST
@pytest.mark.django_db
def test_login(api_client, test_user):
url = reverse('auth-login')
data = {
'username': test_user.username,
'password': test_user.password
}
response = api_client.post(url, data)
assert response.status == status.HTTP_200_OK
@pytest.mark.django_db
def test_login_incorrect_credentials(api_client, test_user):
url = reverse('auth-login')
data = {
'username': test_user.username,
'password': 'wrongpassword'
}
response = api_client.post(url, data)
assert response.status_code == status.HTTP_400_BAD_REQUEST
@pytest.mark.django_db
def test_logout(api_client, test_user):
url = reverse('auth-logout')
api_client.force_authenticate(user=test_user)
response = api_client.post(url)
assert response.status_code == status.HTTP_200_OK
@pytest.mark.django_db
def test_change_password(api_client, test_user):
url = reverse('auth-change-password')
api_client.force_authenticate(user=test_user)
data = {
'password': 'testpassword',
'new_password': 'newtestpassword'
}
response = api_client.post(url, data)
assert response.status_code == status.HTTP_200_OK
@pytest.mark.django_db
def test_change_password_incorrect_credentials(api_client, test_user):
url = reverse('auth-change-password')
api_client.force_authenticate(user=test_user)
data = {
'password': 'wrongpassword',
'new_password': 'newtestpassword'
}
response = api_client.post(url, data)
assert response.status_code == status.HTTP_403_FORBIDDEN
@pytest.mark.django_db
def test_change_username(api_client, test_user):
url = reverse('auth-change-username')
api_client.force_authenticate(user=test_user)
data = {
'password': 'testpassword',
'new_username': 'newtestuser'
}
response = api_client.post(url, data)
assert response.status_code == status.HTTP_200_OK
@pytest.mark.django_db
def test_change_username_incorrect_credentials(api_client, test_user):
url = reverse('auth-change-username')
api_client.force_authenticate(user=test_user)
Уже 2 дня ничего не могу найти ни в инете, ни у себя в коде, голова уже плавится, а нервы на пределе