diff options
| -rw-r--r-- | pydis_site/apps/home/tests/test_views.py | 111 | ||||
| -rw-r--r-- | pydis_site/apps/home/views/account/settings.py | 3 | 
2 files changed, 110 insertions, 4 deletions
diff --git a/pydis_site/apps/home/tests/test_views.py b/pydis_site/apps/home/tests/test_views.py index 7aeaddd2..85423c1c 100644 --- a/pydis_site/apps/home/tests/test_views.py +++ b/pydis_site/apps/home/tests/test_views.py @@ -1,5 +1,112 @@ +from django.contrib.auth.models import User +from django.http import HttpResponseRedirect  from django.test import TestCase -from django_hosts.resolvers import reverse +from django_hosts.resolvers import get_host, reverse, reverse_host + + +def check_redirect_url( +        response: HttpResponseRedirect, reversed_url: str, strip_params=True +) -> bool: +    """ +    Check whether a given redirect response matches a specific reversed URL. + +    Arguments: +    * `response`: The HttpResponseRedirect returned by the test client +    * `reversed_url`: The URL returned by `reverse()` +    * `strip_params`: Whether to strip URL parameters (following a "?") from the URL given in the +                     `response` object +    """ +    host = get_host(None) +    hostname = reverse_host(host) + +    redirect_url = response.url + +    if strip_params and "?" in redirect_url: +        redirect_url = redirect_url.split("?", 1)[0] + +    result = reversed_url == f"//{hostname}{redirect_url}" +    return result + + +class TestAccountDeleteView(TestCase): +    def setUp(self) -> None: +        """Create an authorized Django user for testing purposes.""" +        self.user = User.objects.create( +            username="user#0000" +        ) + +    def test_redirect_when_logged_out(self): +        """Test that the user is redirected to the homepage when not logged in.""" +        url = reverse("account_delete") +        resp = self.client.get(url) +        self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, reverse("home"))) + +    def test_get_when_logged_in(self): +        """Test that the view returns a HTTP 200 when the user is logged in.""" +        url = reverse("account_delete") + +        self.client.force_login(self.user) +        resp = self.client.get(url) +        self.client.logout() + +        self.assertEqual(resp.status_code, 200) + +    def test_post_invalid(self): +        """Test that the user is redirected when the form is filled out incorrectly.""" +        url = reverse("account_delete") + +        self.client.force_login(self.user) + +        resp = self.client.post(url, {}) +        self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, url)) + +        resp = self.client.post(url, {"username": "user"}) +        self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, url)) + +        self.client.logout() + +    def test_post_valid(self): +        """Test that the account is deleted when the form is filled out correctly..""" +        url = reverse("account_delete") + +        self.client.force_login(self.user) + +        resp = self.client.post(url, {"username": "user#0000"}) +        self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, reverse("home"))) + +        with self.assertRaises(User.DoesNotExist): +            User.objects.get(username=self.user.username) + +        self.client.logout() + + +class TestAccountSettingsView(TestCase): +    def setUp(self) -> None: +        """Create an authorized Django user for testing purposes.""" +        self.user = User.objects.create( +            username="user#0000" +        ) + +    def test_redirect_when_logged_out(self): +        """Check that the user is redirected to the homepage when not logged in.""" +        url = reverse("account_settings") +        resp = self.client.get(url) +        self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, reverse("home"))) + +    def test_get_when_logged_in(self): +        """Test that the view returns a HTTP 200 when the user is logged in.""" +        url = reverse("account_settings") + +        self.client.force_login(self.user) +        resp = self.client.get(url) +        self.client.logout() + +        self.assertEqual(resp.status_code, 200)  class TestIndexReturns200(TestCase): @@ -16,6 +123,7 @@ class TestLoginCancelledReturns302(TestCase):          url = reverse('socialaccount_login_cancelled')          resp = self.client.get(url)          self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, reverse("home")))  class TestLoginErrorReturns302(TestCase): @@ -24,3 +132,4 @@ class TestLoginErrorReturns302(TestCase):          url = reverse('socialaccount_login_error')          resp = self.client.get(url)          self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, reverse("home"))) diff --git a/pydis_site/apps/home/views/account/settings.py b/pydis_site/apps/home/views/account/settings.py index aa272552..ee9011da 100644 --- a/pydis_site/apps/home/views/account/settings.py +++ b/pydis_site/apps/home/views/account/settings.py @@ -15,6 +15,3 @@ class SettingsView(LoginRequiredMixin, View):      def get(self, request: HttpRequest) -> HttpResponse:          """HTTP GET: Return the view template."""          return render(request, "home/account/settings.html") - -    def post(self, request: HttpRequest) -> HttpResponse: -        """HTTP POST: Process account changes, as requested by the user."""  |