aboutsummaryrefslogtreecommitdiffstats
path: root/alphabetlearning/users/tests/test_views.py
diff options
context:
space:
mode:
authorMatthew Lemon <y@yulqen.org>2024-10-15 21:01:31 +0100
committerMatthew Lemon <y@yulqen.org>2024-10-15 21:01:31 +0100
commiteeaddb27560d723ca7d61359744ceb2709fccd2d (patch)
tree04ddbc49ae7b73d5f5a9e1716d7227aecd3b9f85 /alphabetlearning/users/tests/test_views.py
parent7a3044c859043837e6c7c95bb4894d04e9b2cbc2 (diff)
Renamed from pyblackbird_cc to alphabetlearning - everywhere
Diffstat (limited to 'alphabetlearning/users/tests/test_views.py')
-rw-r--r--alphabetlearning/users/tests/test_views.py101
1 files changed, 101 insertions, 0 deletions
diff --git a/alphabetlearning/users/tests/test_views.py b/alphabetlearning/users/tests/test_views.py
new file mode 100644
index 0000000..27e6064
--- /dev/null
+++ b/alphabetlearning/users/tests/test_views.py
@@ -0,0 +1,101 @@
+from http import HTTPStatus
+
+import pytest
+from django.conf import settings
+from django.contrib import messages
+from django.contrib.auth.models import AnonymousUser
+from django.contrib.messages.middleware import MessageMiddleware
+from django.contrib.sessions.middleware import SessionMiddleware
+from django.http import HttpRequest
+from django.http import HttpResponseRedirect
+from django.test import RequestFactory
+from django.urls import reverse
+from django.utils.translation import gettext_lazy as _
+
+from alphabetlearning.users.forms import UserAdminChangeForm
+from alphabetlearning.users.models import User
+from alphabetlearning.users.tests.factories import UserFactory
+from alphabetlearning.users.views import UserRedirectView
+from alphabetlearning.users.views import UserUpdateView
+from alphabetlearning.users.views import user_detail_view
+
+pytestmark = pytest.mark.django_db
+
+
+class TestUserUpdateView:
+ """
+ TODO:
+ extracting view initialization code as class-scoped fixture
+ would be great if only pytest-django supported non-function-scoped
+ fixture db access -- this is a work-in-progress for now:
+ https://github.com/pytest-dev/pytest-django/pull/258
+ """
+
+ def dummy_get_response(self, request: HttpRequest):
+ return None
+
+ def test_get_success_url(self, user: User, rf: RequestFactory):
+ view = UserUpdateView()
+ request = rf.get("/fake-url/")
+ request.user = user
+
+ view.request = request
+ assert view.get_success_url() == f"/users/{user.pk}/"
+
+ def test_get_object(self, user: User, rf: RequestFactory):
+ view = UserUpdateView()
+ request = rf.get("/fake-url/")
+ request.user = user
+
+ view.request = request
+
+ assert view.get_object() == user
+
+ def test_form_valid(self, user: User, rf: RequestFactory):
+ view = UserUpdateView()
+ request = rf.get("/fake-url/")
+
+ # Add the session/message middleware to the request
+ SessionMiddleware(self.dummy_get_response).process_request(request)
+ MessageMiddleware(self.dummy_get_response).process_request(request)
+ request.user = user
+
+ view.request = request
+
+ # Initialize the form
+ form = UserAdminChangeForm()
+ form.cleaned_data = {}
+ form.instance = user
+ view.form_valid(form)
+
+ messages_sent = [m.message for m in messages.get_messages(request)]
+ assert messages_sent == [_("Information successfully updated")]
+
+
+class TestUserRedirectView:
+ def test_get_redirect_url(self, user: User, rf: RequestFactory):
+ view = UserRedirectView()
+ request = rf.get("/fake-url")
+ request.user = user
+
+ view.request = request
+ assert view.get_redirect_url() == f"/users/{user.pk}/"
+
+
+class TestUserDetailView:
+ def test_authenticated(self, user: User, rf: RequestFactory):
+ request = rf.get("/fake-url/")
+ request.user = UserFactory()
+ response = user_detail_view(request, pk=user.pk)
+
+ assert response.status_code == HTTPStatus.OK
+
+ def test_not_authenticated(self, user: User, rf: RequestFactory):
+ request = rf.get("/fake-url/")
+ request.user = AnonymousUser()
+ response = user_detail_view(request, pk=user.pk)
+ login_url = reverse(settings.LOGIN_URL)
+
+ assert isinstance(response, HttpResponseRedirect)
+ assert response.status_code == HTTPStatus.FOUND
+ assert response.url == f"{login_url}?next=/fake-url/"