Test return redirect("account_login") в django use pytest
Я использую pytest и coverage для тестирования проекта django Но я не знаю, как проверить блок else, который имеет return redirect("account_login") и исправить красную часть, которая говорит coverage.
По вашему мнению, как я могу написать тест для этой части else и исправить красную часть, где говорится о покрытии?
views.py
@verified_email_required
def profile_view(request, username):
# We check if the user is logged in?
if request.user.is_authenticated:
try:
profiles = Profile.objects.all()[:4]
# get user profile by username
profile = Profile.objects.get(user__username__iexact=username)
user = User.objects.get(username=username)
user_following = following(user)
user_followers = followers(user)
logged_in_user_following = following(request.user)
logged_in_user_followers = followers(request.user)
# if user not found raise 404 error
except ObjectDoesNotExist:
raise Http404
# context data
context = {
"user": user,
"profile": profile,
"profiles": profiles,
"following": user_following,
"followers": user_followers,
}
return render(request, "user_profile/profile.html", context)
# if a user is not login in redirecting to login page
else:
return redirect("account_login")
test_view.py
@pytest.mark.django_db
class TestProfileView:
@pytest.fixture
def user(self):
user, created = User.objects.get_or_create( # created user
username="test_username",
first_name="test_first_name",
last_name="test_last_name",
email="test@test.com",
is_active=True,
is_superuser=False,
)
(
user_email_address,
created,
) = EmailAddress.objects.get_or_create( # user email confirmation
email=user.email, user=user
)
user_email_address.verified = True
user_email_address.primary = True
user_email_address.save()
return user
def test_profile_view_when_user_is_authenticated_return_correct_profile(
self, user, client
):
client.force_login(user) # user logged in
response = client.get(user.profile.get_absolute_url())
content = response.content.decode(response.charset)
assert response.status_code == 200
assert (
'<h1 class="text-3xl md:text-4xl font-semibold">Test_first_name test_last_name</h1>'
in str(content)
)
response = client.get("/user_not_exist", follow=True)
assert response.status_code == 404
response = client.post("/accounts/logout/")
assert response.status_code == 302
def test_profile_view_when_user_is_anonymous_return_login_page(self, user, client):
response = client.get("/test_username/", follow=True)
content = response.content.decode(response.charset)
assertRedirects(response, "/accounts/login/?next=/test_username/")
assert response.status_code == 200
assert response.template_name[0] == "account/login.html"
assert '<h1 class="text-3xl font-semibold text-center">Login</h1>' in str(
content
)
assert response.resolver_match.url_name == "account_login"
assert response.resolver_match.view_name == "account_login"
Я подозреваю, что вы не сможете этого сделать, поскольку ваш декоратор @verified_email_required не позволит незалогиненным людям добраться до этой строки кода.
Я предполагаю, что вы используете allauth, поскольку он предоставляет декоратор именно с таким названием. См. https://django-allauth.readthedocs.io/en/stable/decorators.html, где говорится: Если пользователь не вошел в систему, он действует идентично декоратору login_required.
