Add tests for the allauth social account adapters
Issue: HIC-196
Change-Id: Iec0a5f732c2c03339f389ce3bf2975cd58d148a4
diff --git a/hiccup/tests/__init__.py b/hiccup/tests/__init__.py
new file mode 100644
index 0000000..13c7507
--- /dev/null
+++ b/hiccup/tests/__init__.py
@@ -0,0 +1 @@
+"""Tests for the Hiccup modules."""
diff --git a/hiccup/tests/test_allauth_adapters.py b/hiccup/tests/test_allauth_adapters.py
new file mode 100644
index 0000000..c349688
--- /dev/null
+++ b/hiccup/tests/test_allauth_adapters.py
@@ -0,0 +1,132 @@
+"""Tests for the allauth adapters module."""
+
+from allauth.account.models import EmailAddress
+from allauth.socialaccount.models import SocialLogin, SocialAccount
+from django.contrib.auth.models import Group, User
+from django.core.exceptions import PermissionDenied
+from django.http import HttpRequest
+from django.test import TestCase
+
+from hiccup.allauth_adapters import (
+ FairphoneAccountAdapter,
+ FormAccountAdapter,
+ FP_STAFF_GROUP_NAME,
+)
+from hiccup import settings
+
+
+class Dummy:
+ """Create dummies class instances for testing."""
+
+ EMAIL_FAIRPHONE = "test@fairphone.com"
+ EMAIL_OTHER = "test@test.com"
+
+ @staticmethod
+ def create_sociallogin(user_email):
+ """Create a dummy sociallogin instance.
+
+ Args:
+ user_email: The email used to login.
+
+ Returns: The sociallogin instance.
+
+ """
+ sociallogin = SocialLogin(
+ user=User(email=user_email),
+ account=SocialAccount(
+ provider=next(iter(settings.SOCIALACCOUNT_PROVIDERS))
+ ),
+ email_addresses=[EmailAddress(email=user_email, verified=True)],
+ )
+ return sociallogin
+
+ @staticmethod
+ def create_fp_staff_group():
+ """Create a FP staff group instance and save it to the database."""
+ group = Group(name=FP_STAFF_GROUP_NAME)
+ group.save()
+ return group
+
+
+class FairphoneAccountAdapterTests(TestCase):
+ """Tests for the Fairphone account adapter."""
+
+ def setUp(self):
+ """Create a Fairphone account adapter instance."""
+ self.fp_account_adapter = FairphoneAccountAdapter()
+
+ def test_is_open_for_signup(self):
+ """Validate that the adapter is open for signup."""
+ request = HttpRequest()
+ sociallogin = Dummy.create_sociallogin(Dummy.EMAIL_FAIRPHONE)
+
+ self.assertTrue(
+ self.fp_account_adapter.is_open_for_signup(request, sociallogin)
+ )
+
+ def _save_user(self, user_email):
+ request = HttpRequest()
+ request.session = self.client.session
+
+ sociallogin = Dummy.create_sociallogin(user_email)
+
+ return self.fp_account_adapter.save_user(request, sociallogin)
+
+ def test_save_user_with_fp_email(self):
+ """Test saving a user with a Fairphone E-Mail address."""
+ # Create the Fairphone staff group
+ fp_staff_group = Dummy.create_fp_staff_group()
+
+ # Save a user with a Fairphone E-Mail address
+ user = self._save_user(Dummy.EMAIL_FAIRPHONE)
+
+ # Assert that the user has been added to the Fairphone staff group
+ self.assertIn(fp_staff_group, user.groups.all())
+
+ def test_save_user_without_fp_email(self):
+ """Test saving a user without a Fairphone E-Mail address."""
+ # Create the Fairphone staff group
+ fp_staff_group = Dummy.create_fp_staff_group()
+
+ # Save a user without a Fairphone E-Mail address
+ user = self._save_user(Dummy.EMAIL_OTHER)
+
+ # Assert that the user has not been added to the Fairphone staff group
+ self.assertNotIn(fp_staff_group, user.groups.all())
+
+ def _populate_user(self, user_email):
+ request = HttpRequest()
+ sociallogin = Dummy.create_sociallogin(user_email)
+ data = {"email": user_email}
+
+ return self.fp_account_adapter.populate_user(request, sociallogin, data)
+
+ def test_populate_user_with_fp_email(self):
+ """Test populating a user with a Fairphone E-Mail address."""
+ user = self._populate_user(Dummy.EMAIL_FAIRPHONE)
+
+ # Assert that the user has been populated successfully and its email
+ # address is correct
+ self.assertEqual(user.email, Dummy.EMAIL_FAIRPHONE)
+
+ def test_populate_user_without_fp_email(self):
+ """Test populating a user without a Fairphone E-Mail address."""
+ user_email = Dummy.EMAIL_OTHER
+
+ # Assert that a permission denied error is raised when attempting to
+ # populate the user
+ with self.assertRaises(PermissionDenied):
+ self._populate_user(user_email)
+
+
+class FormAccountAdapterTests(TestCase):
+ """Tests for the form account adapter."""
+
+ def setUp(self):
+ """Create a form account adapter instance."""
+ self.form_account_adapter = FormAccountAdapter()
+
+ def test_is_not_open_for_signup(self):
+ """Validate that the adapter is not open for signup."""
+ request = HttpRequest()
+ self.assertFalse(self.form_account_adapter.is_open_for_signup(request))