Files
django-wiki/tests/core/test_accounts.py
2025-09-17 07:52:16 -05:00

154 lines
5.1 KiB
Python

from django.conf import settings as django_settings
from django.contrib import auth
from django.contrib.auth import authenticate
from django.contrib.auth.models import AnonymousUser
from django.shortcuts import resolve_url
from wiki.conf import settings as wiki_settings
from wiki.models import reverse
from ..base import ArticleWebTestUtils
from ..base import DjangoClientTestBase
from ..base import RequireRootArticleMixin
from ..base import SUPERUSER1_PASSWORD
from ..base import SUPERUSER1_USERNAME
from ..base import TestBase
from ..base import wiki_override_settings
from ..testdata.models import CustomUser
SIGNUP_TEST_USERNAME = "wiki"
SIGNUP_TEST_PASSWORD = "wiki1234567"
class AccountUpdateTest(
RequireRootArticleMixin, ArticleWebTestUtils, DjangoClientTestBase
):
def test_password_change(self):
"""
Test that we can make a successful password change via the update form
"""
# Check out that it works as expected, notice that there is no referrer
# on this GET request.
self.client.get(
resolve_url(
"wiki:profile_update",
)
)
# Now check that we don't succeed with unmatching passwords
example_data = {
"password1": "abcdef",
"password2": "abcdef123",
"email": self.superuser1.email,
}
# save a new revision
response = self.client.post(
resolve_url("wiki:profile_update"), example_data
)
self.assertContains(
response, "Passwords don", status_code=200
) # Django 2/3 output different escaped versions of single quote in don't
# Now check that we don't succeed with unmatching passwords
example_data = {
"password1": "abcdef",
"password2": "abcdef",
"email": self.superuser1.email,
}
# save a new revision
response = self.client.post(
resolve_url("wiki:profile_update"), example_data
)
# Need to force str() because of:
# TypeError: coercing to Unicode: need string or buffer, __proxy__
# found
self.assertRedirects(response, str(django_settings.LOGIN_REDIRECT_URL))
self.assertEqual(
self.superuser1,
authenticate(
username=self.superuser1.username,
password=example_data["password1"],
),
)
class UpdateProfileViewTest(
RequireRootArticleMixin, ArticleWebTestUtils, DjangoClientTestBase
):
def test_update_profile(self):
self.client.post(
resolve_url("wiki:profile_update"),
{
"email": "test@test.com",
"password1": "newPass",
"password2": "newPass",
},
follow=True,
)
test_auth = authenticate(username="admin", password="newPass")
self.assertIsNotNone(test_auth)
self.assertEqual(test_auth.email, "test@test.com")
@wiki_override_settings(ACCOUNT_HANDLING=True)
class LogoutViewTests(RequireRootArticleMixin, DjangoClientTestBase):
def test_logout_account_handling(self):
self.client.get(wiki_settings.LOGOUT_URL)
user = auth.get_user(self.client)
self.assertIs(auth.get_user(self.client).is_authenticated, False)
self.assertIsInstance(user, AnonymousUser)
@wiki_override_settings(ACCOUNT_HANDLING=True)
class LoginTestViews(RequireRootArticleMixin, TestBase):
def test_already_signed_in(self):
self.client.force_login(self.superuser1)
response = self.client.get(wiki_settings.LOGIN_URL)
self.assertRedirects(response, reverse("wiki:root"))
def test_log_in(self):
self.client.post(
wiki_settings.LOGIN_URL,
{"username": SUPERUSER1_USERNAME, "password": SUPERUSER1_PASSWORD},
)
self.assertIs(self.superuser1.is_authenticated, True)
self.assertEqual(auth.get_user(self.client), self.superuser1)
class SignupViewTests(RequireRootArticleMixin, TestBase):
@wiki_override_settings(ACCOUNT_HANDLING=True, ACCOUNT_SIGNUP_ALLOWED=True)
def test_signup(self):
response = self.client.post(
wiki_settings.SIGNUP_URL,
data={
"password1": SIGNUP_TEST_PASSWORD,
"password2": SIGNUP_TEST_PASSWORD,
"username": SIGNUP_TEST_USERNAME,
"email": "wiki@wiki.com",
},
)
self.assertIs(
CustomUser.objects.filter(email="wiki@wiki.com").exists(), True
)
self.assertRedirects(response, reverse("wiki:login"))
# Test that signing up the same user again gives a validation error
# Regression test: https://github.com/django-wiki/django-wiki/issues/1152
response = self.client.post(
wiki_settings.SIGNUP_URL,
data={
"password1": SIGNUP_TEST_PASSWORD,
"password2": SIGNUP_TEST_PASSWORD,
"username": SIGNUP_TEST_USERNAME,
"email": "wiki@wiki.com",
},
)
self.assertIs(response.status_code, 200)
self.assertContains(response, "username already exists")