Как сделать модульные тесты на LoginView и LogoutView в Django?

Я пытаюсь написать правильные тесты для моих представлений, которые являются просто подклассами LoginView и LogoutView из django.contrib.auth.views.

from django.contrib.auth.views import LoginView, LogoutView

class UserLoginView(LoginView):
    template_name = 'finder/login.html'
    next_page = reverse_lazy('book-list')


class UserLogoutView(LogoutView):
    template_name = 'finder/logout.html'
    next_page = reverse_lazy('book-list')

urls.py:

    path('login/', views.UserLoginView.as_view(), name='login'),
    path('logout/', views.UserLogoutView.as_view(), name='logout'),
    path('book/list/', views.BookListView.as_view(), name='book-list'),

Что мне следует учитывать и как правильно писать тестовые случаи в моем test.views.py? На данный момент у меня есть что-то вроде этого:

class UserLoginViewTest(TestCase):
    def setUp(self) -> None:
        self.factory = RequestFactory()
        self.user = User.objects.create_user(username='dummy', password='123secret')

    def test_positive_login_view(self):
        # request = self.factory.post(path='/login/', data={'username': 'dummy', 'password': '123secret'})
        # request.user = self.user
        # response = views.UserLoginView.as_view()(request)

        response = self.client.post(path='/login/', data={'username': 'dummy', 'password': '123secret'})
        self.assertRedirects(response, '/book/list/')

    def test_negative_login_view(self):
        response = self.client.post(path='/login/', data={'username': 'any', 'password': 'any'})
        self.assertEqual(response.status_code, 200)

Но, честно говоря, эти тесты подходят только для ответов, которые я получил обратно, так что, например, я не знаю, почему мой status_code в ответе с неправильными учетными данными равен 200, а не что-то другое, например 4xx. И что я должен тестировать в таких auth представлениях? Что мой пользователь получает аутентифицированный статус? Но как?

И второй вопрос: как использовать requestfactory в этом случае? Я пробовал с кодом, который закомментирован, но получил status_code=403 при передаче правильных учетных данных...

Вернуться на верх