Django testcase для API logout с миксином LoginRequired, но для анонимного пользователя он перенаправляет на API login с параметром ?next=
Но что если я хочу проверить без логина. Например, у меня есть один api logout, который имеет LoginRequired mixin, я хочу проверить, что любой человек не может нажать logout, если он не вошел в систему. Поэтому я создал тесткейс, как показано ниже.
@pytest.mark.django_db
def test_user_logout_logged_in_user(self, client):
url = reverse('logout')
response = client.get(url)
assert response.status_code == 302
assertRedirects(response, reverse('login'))
но я получил эту ошибку, AssertionError: '/auth/login-view/?next=%2Fauth%2Flogout-view%2F' != '/auth/login-view/'
Значит, я получаю ?next={что-то для после входа в api}.
Как проверить, что перенаправленный api является login api.
Мой logout api выглядит следующим образом:
class LogoutView(LoginRequiredMixin, View):
"""
description: This is user logout view.
GET request will log out user and redirects to home page.
"""
def get(self, request):
return LogoutService.logout_user(request=request)
class LogoutService:
@staticmethod
def logout_user(request):
logout(request)
messages.success(request, ACCOUNT_LOGOUT_SUCCESS)
return redirect('home')
Тест Django для страницы, которая перенаправляет
Я пробовал этот ответ, но он предназначен для зарегистрированного пользователя. Я хочу протестировать для не аутентифицированного пользователя.
Чтобы проверить, что представление перенаправляет с параметром "next" правильно, необходимо добавить параметр next get в URL логина при тестировании
@pytest.mark.django_db
def test_login_required_redirect(self, client):
url = reverse('someview')
response = client.get(url)
assertRedirects(response, f"{reverse('login')}?next={url}")
Не используйте LoginRequiredMixin для представления выхода из системы, вы установите его таким образом, и это приведет к тому, что пользователь мгновенно выйдет из системы после входа - обработайте перенаправление вручную в вашем представлении
class LogoutView(View):
def get(self, request):
if not request.user.is_authenticated:
return redirect('login')
return LogoutService.logout_user(request=request)