diff options
| -rw-r--r-- | pydis_site/apps/home/tests/test_views.py | 86 | ||||
| -rw-r--r-- | pydis_site/apps/home/views/account/settings.py | 2 | ||||
| -rw-r--r-- | pydis_site/templates/base/navbar.html | 13 | 
3 files changed, 96 insertions, 5 deletions
| diff --git a/pydis_site/apps/home/tests/test_views.py b/pydis_site/apps/home/tests/test_views.py index 85423c1c..572317a7 100644 --- a/pydis_site/apps/home/tests/test_views.py +++ b/pydis_site/apps/home/tests/test_views.py @@ -1,3 +1,4 @@ +from allauth.socialaccount.models import SocialAccount  from django.contrib.auth.models import User  from django.http import HttpResponseRedirect  from django.test import TestCase @@ -91,6 +92,42 @@ class TestAccountSettingsView(TestCase):              username="user#0000"          ) +        self.user_unlinked = User.objects.create( +            username="user#9999" +        ) + +        self.user_unlinked_discord = User.objects.create( +            username="user#1234" +        ) + +        self.user_unlinked_github = User.objects.create( +            username="user#1111" +        ) + +        self.github_account = SocialAccount.objects.create( +            user=self.user, +            provider="github", +            uid="0" +        ) + +        self.discord_account = SocialAccount.objects.create( +            user=self.user, +            provider="discord", +            uid="0000" +        ) + +        self.github_account_secondary = SocialAccount.objects.create( +            user=self.user_unlinked_discord, +            provider="github", +            uid="1" +        ) + +        self.discord_account_secondary = SocialAccount.objects.create( +            user=self.user_unlinked_github, +            provider="discord", +            uid="1111" +        ) +      def test_redirect_when_logged_out(self):          """Check that the user is redirected to the homepage when not logged in."""          url = reverse("account_settings") @@ -108,6 +145,55 @@ class TestAccountSettingsView(TestCase):          self.assertEqual(resp.status_code, 200) +        self.client.force_login(self.user_unlinked) +        resp = self.client.get(url) +        self.client.logout() + +        self.assertEqual(resp.status_code, 200) + +        self.client.force_login(self.user_unlinked_discord) +        resp = self.client.get(url) +        self.client.logout() + +        self.assertEqual(resp.status_code, 200) + +        self.client.force_login(self.user_unlinked_github) +        resp = self.client.get(url) +        self.client.logout() + +        self.assertEqual(resp.status_code, 200) + +    def test_post_invalid(self): +        """Test the behaviour of invalid POST submissions.""" +        url = reverse("account_settings") + +        self.client.force_login(self.user_unlinked) + +        resp = self.client.post(url, {"provider": "discord"}) +        self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, reverse("home"))) + +        resp = self.client.post(url, {"provider": "github"}) +        self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, reverse("home"))) + +        self.client.logout() + +    def test_post_valid(self): +        """Ensure that GitHub is unlinked with a valid POST submission.""" +        url = reverse("account_settings") + +        self.client.force_login(self.user) + +        resp = self.client.post(url, {"provider": "github"}) +        self.assertEqual(resp.status_code, 302) +        self.assertTrue(check_redirect_url(resp, reverse("home"))) + +        with self.assertRaises(SocialAccount.DoesNotExist): +            SocialAccount.objects.get(user=self.user, provider="github") + +        self.client.logout() +  class TestIndexReturns200(TestCase):      def test_index_returns_200(self): diff --git a/pydis_site/apps/home/views/account/settings.py b/pydis_site/apps/home/views/account/settings.py index 84a2dea0..3a817dbc 100644 --- a/pydis_site/apps/home/views/account/settings.py +++ b/pydis_site/apps/home/views/account/settings.py @@ -36,7 +36,7 @@ class SettingsView(LoginRequiredMixin, View):              if account.provider == "discord":                  context["discord"] = account -            elif account.provider == "github": +            if account.provider == "github":                  context["github"] = account          return render(request, "home/account/settings.html", context=context) diff --git a/pydis_site/templates/base/navbar.html b/pydis_site/templates/base/navbar.html index 6943c2b6..2ba5bdd4 100644 --- a/pydis_site/templates/base/navbar.html +++ b/pydis_site/templates/base/navbar.html @@ -127,16 +127,21 @@  {% if user.is_authenticated %}    <script defer type="text/javascript"> +    // Script which loads and sets up the account settings modal. +    // This script must be placed in a template, or rewritten to take the fetch +    // URL as a function argument, in order to be used. +      "use strict"; +    // Create and prepend a new div for this modal      let element = document.createElement("div");      document.body.prepend(element); -    fetch("{% url "account_settings" %}") -      .then((response) => response.text()) +    fetch("{% url "account_settings" %}")   // Fetch the URL +      .then((response) => response.text())  // Read in the data stream as text        .then((text) => { -        element.outerHTML = text; -        setupModal(document.getElementById("account-modal")); +        element.outerHTML = text;  // Replace the div's HTML with the loaded modal HTML +        setupModal(document.getElementById("account-modal"));  // Set up the modal        });    </script>  {% endif %} | 
