diff options
| author | Hisham Mahmood <hishammahmood41@gmail.com> | 2024-05-05 11:21:28 +0500 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2024-05-22 08:51:17 +0200 |
| commit | c7fc9f20b49b5889a9a8f47de45165ac443c1a21 (patch) | |
| tree | 113e55d5b047f479375638c1f17d9c127aedf618 /tests/auth_tests/test_middleware.py | |
| parent | 7857507c7fc43350701700d4215a37baea7655f0 (diff) | |
Fixed #31405 -- Added LoginRequiredMiddleware.
Co-authored-by: Adam Johnson <me@adamj.eu>
Co-authored-by: Mehmet İnce <mehmet@mehmetince.net>
Co-authored-by: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com>
Diffstat (limited to 'tests/auth_tests/test_middleware.py')
| -rw-r--r-- | tests/auth_tests/test_middleware.py | 141 |
1 files changed, 139 insertions, 2 deletions
diff --git a/tests/auth_tests/test_middleware.py b/tests/auth_tests/test_middleware.py index e7c5a525cd..a837eb8b96 100644 --- a/tests/auth_tests/test_middleware.py +++ b/tests/auth_tests/test_middleware.py @@ -1,8 +1,14 @@ -from django.contrib.auth.middleware import AuthenticationMiddleware +from django.conf import settings +from django.contrib.auth import REDIRECT_FIELD_NAME +from django.contrib.auth.middleware import ( + AuthenticationMiddleware, + LoginRequiredMiddleware, +) from django.contrib.auth.models import User from django.core.exceptions import ImproperlyConfigured from django.http import HttpRequest, HttpResponse -from django.test import TestCase +from django.test import TestCase, modify_settings, override_settings +from django.urls import reverse class TestAuthenticationMiddleware(TestCase): @@ -50,3 +56,134 @@ class TestAuthenticationMiddleware(TestCase): self.assertEqual(auser, self.user) auser_second = await self.request.auser() self.assertIs(auser, auser_second) + + +@override_settings(ROOT_URLCONF="auth_tests.urls") +@modify_settings( + MIDDLEWARE={"append": "django.contrib.auth.middleware.LoginRequiredMiddleware"} +) +class TestLoginRequiredMiddleware(TestCase): + @classmethod + def setUpTestData(cls): + cls.user = User.objects.create_user( + "test_user", "test@example.com", "test_password" + ) + + def setUp(self): + self.middleware = LoginRequiredMiddleware(lambda req: HttpResponse()) + self.request = HttpRequest() + + def test_public_paths(self): + paths = ["public_view", "public_function_view"] + for path in paths: + response = self.client.get(f"/{path}/") + self.assertEqual(response.status_code, 200) + + def test_protected_paths(self): + paths = ["protected_view", "protected_function_view"] + for path in paths: + response = self.client.get(f"/{path}/") + self.assertRedirects( + response, + settings.LOGIN_URL + f"?next=/{path}/", + fetch_redirect_response=False, + ) + + def test_login_required_paths(self): + paths = ["login_required_cbv_view", "login_required_decorator_view"] + for path in paths: + response = self.client.get(f"/{path}/") + self.assertRedirects( + response, + "/custom_login/" + f"?step=/{path}/", + fetch_redirect_response=False, + ) + + def test_admin_path(self): + admin_url = reverse("admin:index") + response = self.client.get(admin_url) + self.assertRedirects( + response, + reverse("admin:login") + f"?next={admin_url}", + target_status_code=200, + ) + + def test_non_existent_path(self): + response = self.client.get("/non_existent/") + self.assertEqual(response.status_code, 404) + + def test_paths_with_logged_in_user(self): + paths = [ + "public_view", + "public_function_view", + "protected_view", + "protected_function_view", + "login_required_cbv_view", + "login_required_decorator_view", + ] + self.client.login(username="test_user", password="test_password") + for path in paths: + response = self.client.get(f"/{path}/") + self.assertEqual(response.status_code, 200) + + def test_get_login_url_from_view_func(self): + def view_func(request): + return HttpResponse() + + view_func.login_url = "/custom_login/" + login_url = self.middleware.get_login_url(view_func) + self.assertEqual(login_url, "/custom_login/") + + @override_settings(LOGIN_URL="/settings_login/") + def test_get_login_url_from_settings(self): + login_url = self.middleware.get_login_url(lambda: None) + self.assertEqual(login_url, "/settings_login/") + + @override_settings(LOGIN_URL=None) + def test_get_login_url_no_login_url(self): + with self.assertRaises(ImproperlyConfigured) as e: + self.middleware.get_login_url(lambda: None) + self.assertEqual( + str(e.exception), + "No login URL to redirect to. Define settings.LOGIN_URL or provide " + "a login_url via the 'django.contrib.auth.decorators.login_required' " + "decorator.", + ) + + def test_get_redirect_field_name_from_view_func(self): + def view_func(request): + return HttpResponse() + + view_func.redirect_field_name = "next_page" + redirect_field_name = self.middleware.get_redirect_field_name(view_func) + self.assertEqual(redirect_field_name, "next_page") + + @override_settings( + MIDDLEWARE=[ + "django.contrib.sessions.middleware.SessionMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "auth_tests.test_checks.LoginRequiredMiddlewareSubclass", + ], + LOGIN_URL="/settings_login/", + ) + def test_login_url_resolve_logic(self): + paths = ["login_required_cbv_view", "login_required_decorator_view"] + for path in paths: + response = self.client.get(f"/{path}/") + self.assertRedirects( + response, + "/custom_login/" + f"?step=/{path}/", + fetch_redirect_response=False, + ) + paths = ["protected_view", "protected_function_view"] + for path in paths: + response = self.client.get(f"/{path}/") + self.assertRedirects( + response, + f"/settings_login/?redirect_to=/{path}/", + fetch_redirect_response=False, + ) + + def test_get_redirect_field_name_default(self): + redirect_field_name = self.middleware.get_redirect_field_name(lambda: None) + self.assertEqual(redirect_field_name, REDIRECT_FIELD_NAME) |
