Coverage for accounts/tests/test_views.py: 98.44%

64 statements  

« prev     ^ index     » next       coverage.py v7.17.0, created at 2026-10-23 15:55 -0700

1"""Test Views for bookstore user accounts.""" 

2 

3import pytest 1a

4from django.contrib.auth import get_user_model 1a

5from django.contrib.messages.middleware import MessageMiddleware 1a

6from django.contrib.sessions.middleware import SessionMiddleware 1a

7from django.http import HttpRequest 1a

8from django.test import RequestFactory, TestCase 1a

9from django.urls import reverse 1a

10 

11from ..forms import CustomUserChangeForm 1a

12from ..models import CustomUser 1a

13from ..views import UserRedirectView, UserUpdateView 1a

14 

15pytestmark = pytest.mark.django_db 1a

16 

17 

18class TestUserSignup(TestCase): 1a

19 username = "newuser" 1a

20 email = "newuser@example.com" 1a

21 

22 def setUp(self): 1a

23 url = reverse("account_signup") 1a

24 self.response = self.client.get(url) 1a

25 

26 def test_signup_template(self): 1a

27 self.assertEqual(self.response.status_code, 200) 1a

28 self.assertTemplateUsed(self.response, "account/signup.html") 1a

29 self.assertContains(self.response, "Sign Up") 1a

30 self.assertNotContains(self.response, "This does not belong here.") 1a

31 

32 def test_signup_form(self): 1a

33 new_user = get_user_model().objects.create_user( # noqa: F841 1a

34 self.username, self.email 

35 ) 

36 self.assertEqual(get_user_model().objects.all().count(), 1) 1a

37 self.assertEqual(get_user_model().objects.all()[0].username, self.username) 1a

38 self.assertEqual(get_user_model().objects.all()[0].email, self.email) 1a

39 

40 

41class TestUserUpdateView: 1a

42 """TODO: 

43 

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 """ 

49 

50 def dummy_get_response(self, request: HttpRequest): 1a

51 return None 

52 

53 def test_get_success_url(self, user: CustomUser, request_factory: RequestFactory): 1a

54 view = UserUpdateView() 1a

55 request = request_factory.get("/fake-url/") 1a

56 request.user = user 1a

57 

58 view.request = request 1a

59 

60 assert view.get_success_url() == f"/accounts/{user.username}/" 1a

61 

62 def test_get_object(self, user: CustomUser, request_factory: RequestFactory): 1a

63 view = UserUpdateView() 1a

64 request = request_factory.get("/fake-url/") 1a

65 request.user = user 1a

66 

67 view.request = request 1a

68 

69 assert view.get_object() == user 1a

70 

71 def test_form_valid(self, user: CustomUser, request_factory: RequestFactory): 1a

72 view = UserUpdateView() 1a

73 form_data = {"name": "John Doe"} 1a

74 request = request_factory.post(reverse("user_update"), form_data) 1a

75 

76 # Add the session/message middleware to the request 

77 SessionMiddleware(self.dummy_get_response).process_request(request) 1a

78 MessageMiddleware(self.dummy_get_response).process_request(request) 1a

79 request.user = user 1a

80 

81 view.request = request 1a

82 

83 # Initialize the form 

84 form = CustomUserChangeForm() 1a

85 form.cleaned_data = {} 1a

86 view.form_valid(form) 1a

87 

88 response = UserUpdateView.as_view()(request) 1a

89 user.refresh_from_db() 1a

90 

91 assert response.status_code == 302 1a

92 assert user.name == form_data["name"] 1a

93 

94 

95class TestUserRedirectView: 1a

96 def test_get_redirect_url(self, user: CustomUser, request_factory: RequestFactory): 1a

97 view = UserRedirectView() 1a

98 request = request_factory.get("/fake-url") 1a

99 request.user = user 1a

100 

101 view.request = request 1a

102 

103 assert view.get_redirect_url() == f"/accounts/{user.username}/" 1a