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

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

2 

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 

10 

11from ..forms import CustomUserChangeForm 

12from ..models import CustomUser 

13from ..views import UserRedirectView, UserUpdateView 

14 

15pytestmark = pytest.mark.django_db 

16 

17 

18class TestUserSignup(TestCase): 

19 username = "newuser" 

20 email = "newuser@example.com" 

21 

22 def setUp(self): 

23 url = reverse("account_signup") 

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

25 

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

31 

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

39 

40 

41class TestUserUpdateView: 

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): 

51 return None 

52 

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

57 

58 view.request = request 1c

59 

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

61 

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

66 

67 view.request = request 1d

68 

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

70 

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

75 

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

80 

81 view.request = request 1b

82 

83 # Initialize the form 

84 form = CustomUserChangeForm() 1b

85 form.cleaned_data = {} 1b

86 view.form_valid(form) 1b

87 

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

89 user.refresh_from_db() 1b

90 

91 assert response.status_code == 302 1b

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

93 

94 

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

100 

101 view.request = request 1e

102 

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