Coverage for accounts/tests/test_views.py: 98.44%
64 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-24 18:34 -0700
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-24 18:34 -0700
1"""Test Views for bookstore user accounts."""
3import pytest
4from django.contrib.auth import get_user_model
5from django.contrib.messages.middleware import MessageMiddleware
6from django.contrib.sessions.middleware import SessionMiddleware
7from django.http import HttpRequest
8from django.test import RequestFactory, TestCase
9from django.urls import reverse
11from ..forms import CustomUserChangeForm
12from ..models import CustomUser
13from ..views import UserRedirectView, UserUpdateView
15pytestmark = pytest.mark.django_db
18class TestUserSignup(TestCase):
19 username = "newuser"
20 email = "newuser@example.com"
22 def setUp(self):
23 url = reverse("account_signup")
24 self.response = self.client.get(url)
26 def test_signup_template(self):
27 self.assertEqual(self.response.status_code, 200) 1f
28 self.assertTemplateUsed(self.response, "account/signup.html") 1f
29 self.assertContains(self.response, "Sign Up") 1f
30 self.assertNotContains(self.response, "This does not belong here.") 1f
32 def test_signup_form(self):
33 new_user = get_user_model().objects.create_user( # noqa: F841 1g
34 self.username, self.email
35 )
36 self.assertEqual(get_user_model().objects.all().count(), 1) 1g
37 self.assertEqual(get_user_model().objects.all()[0].username, self.username) 1g
38 self.assertEqual(get_user_model().objects.all()[0].email, self.email) 1g
41class TestUserUpdateView:
42 """TODO:
44 extracting view initialization code as class-scoped fixture
45 would be great if only pytest-django supported non-function-scoped
46 fixture db access -- this is a work-in-progress for now:
47 https://github.com/pytest-dev/pytest-django/pull/258
48 """
50 def dummy_get_response(self, request: HttpRequest):
51 return None
53 def test_get_success_url(self, user: CustomUser, request_factory: RequestFactory):
54 view = UserUpdateView() 1c
55 request = request_factory.get("/fake-url/") 1c
56 request.user = user 1c
58 view.request = request 1c
60 assert view.get_success_url() == f"/accounts/{user.username}/" 1c
62 def test_get_object(self, user: CustomUser, request_factory: RequestFactory):
63 view = UserUpdateView() 1d
64 request = request_factory.get("/fake-url/") 1d
65 request.user = user 1d
67 view.request = request 1d
69 assert view.get_object() == user 1d
71 def test_form_valid(self, user: CustomUser, request_factory: RequestFactory):
72 view = UserUpdateView() 1b
73 form_data = {"name": "John Doe"} 1b
74 request = request_factory.post(reverse("user_update"), form_data) 1b
76 # Add the session/message middleware to the request
77 SessionMiddleware(self.dummy_get_response).process_request(request) 1b
78 MessageMiddleware(self.dummy_get_response).process_request(request) 1b
79 request.user = user 1b
81 view.request = request 1b
83 # Initialize the form
84 form = CustomUserChangeForm() 1b
85 form.cleaned_data = {} 1b
86 view.form_valid(form) 1b
88 response = UserUpdateView.as_view()(request) 1b
89 user.refresh_from_db() 1b
91 assert response.status_code == 302 1b
92 assert user.name == form_data["name"] 1b
95class TestUserRedirectView:
96 def test_get_redirect_url(self, user: CustomUser, request_factory: RequestFactory):
97 view = UserRedirectView() 1e
98 request = request_factory.get("/fake-url") 1e
99 request.user = user 1e
101 view.request = request 1e
103 assert view.get_redirect_url() == f"/accounts/{user.username}/" 1e