Сбой тестирования аутентификации Django: Учетные данные для аутентификации не были предоставлены

Я работаю над пользовательской логикой своего Django-проекта. Несмотря на то, что выход из системы (с использованием аутентификации по кукам сессии) прекрасно работает в браузере, во время тестирования он почему-то не работает. Похоже, что куки из ответа на вход не сохраняются корректно для последующего запроса. Вот соответствующие выдержки из кода моего проекта:

views.py

class UserLogoutView(generics.GenericAPIView):
    permission_classes: list[permissions.BasePermission] = [permissions.IsAuthenticated]

    def get_serializer_class(self) -> serializers.Serializer:
        return serializers.Serializer  # Return basic Serializer class

    def delete(self, request: Request) -> Response:
        response: Response
        try:
            session_key: str = request.COOKIES.get("session")
            token: Token = Token.objects.get(key=session_key)
            response = Response(
                status=status.HTTP_200_OK,
                data={"detail": "Logout successful"},
            )
            response.delete_cookie(key="session")
            token.delete()

        except ObjectDoesNotExist:
            response = Response(
                {"error": "Session cookie not found"},
                status=status.HTTP_401_UNAUTHORIZED,
            )
        except Exception as error:
            print(error)
            response = Response(
                {"error": str(error)},
                status=status.HTTP_400_BAD_REQUEST,
            )

        return response

tests_views.py

class TestLogoutViews(TestCase):
    def setUp(self) -> None:
        self.client = Client()
        self.data: dict[str, str] = {
            "username": "testuser",
            "email": "test@test.com",
            "password": "Password1",
        }
        self.logout_url: str = reverse("user_logout")
        self.login_url: str = reverse("user_login")

        self.client.post(
            reverse("user_register"),
            json.dumps(self.data),
            content_type="application/json",
        )
        self.data.pop("email")

    def test_logout_view_correct_DELETE(self) -> None:

        # Log in first
        response: HttpResponse = self.client.post(
            self.login_url,
            json.dumps(self.data),
            content_type="application/json",
        )

        print()
        print(response.status_code, self.client.cookies)
        print()

        # Send the DELETE request
        response: HttpResponse = self.client.delete(self.logout_url)

        # Check if the response is 200
        self.assertEqual(
            response.status_code,
            200,
            msg=(
                f"Response is {response.status_code}, expected 200. ",
                f"Response content: {response.content}",
            ),
        )

        # Check if the cookie is deleted
        self.assertFalse(
            "session" in self.client.cookies, msg="Cookie should be deleted"
        )

settings.py

REST_FRAMEWORK: dict[str, str] = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework.authentication.TokenAuthentication",
        "rest_framework.authentication.SessionAuthentication",
    ),
    "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
}

Вывод:

200 Set-Cookie: session=304a23566b589374cf24e577aac2d2370c40de98; HttpOnly; Path=/; SameSite=lax; Secure
======================================================================
FAIL: test_logout_view_correct_DELETE (users.test_views.TestLogoutViews)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\user\repositories\flicks-and-picks\src\backend\apps\users\test_views.py", line 518, in test_logout_view_correct_DELETE
    self.assertEqual(
AssertionError: 401 != 200 : ('Response is 401, expected 200. ', 'Response content: b\'{"detail":"Authentication credentials were not provided."}\'')
Вернуться на верх