diff --git a/authens/tests/cas_utils.py b/authens/tests/cas_utils.py index 089ffb7..76d862c 100644 --- a/authens/tests/cas_utils.py +++ b/authens/tests/cas_utils.py @@ -17,3 +17,27 @@ class FakeCASClient: ) } return self.cas_login, attributes, None + + +class FakeLDAPObject: + """Fake object to be used in place of the result of `ldap.initialize`. + + By default, always return the same entry 'johndoe'. + """ + + def __init__(self, cas_login: str, entrance_year: int): + self.cas_login = cas_login + self.entrance_year = entrance_year + + def search_s(self, base, scope, request, *args): + if request != "(uid={})".format(self.cas_login): + raise ValueError("I don't know how to answer this request!") + + home_dir = "/users/{}/info/{}".format(self.entrance_year % 100, self.cas_login) + dn = "whatever" + attrs = { + "uid": [self.cas_login.encode("utf-8")], + "cn": ["{}'s long name".format(self.cas_login).encode("utf-8")], + "homeDirectory": [home_dir.encode("utf-8")], + } + return [(dn, attrs)] diff --git a/authens/tests/test_shortcuts.py b/authens/tests/test_shortcuts.py new file mode 100644 index 0000000..3c2a16b --- /dev/null +++ b/authens/tests/test_shortcuts.py @@ -0,0 +1,47 @@ +from unittest import mock + +from django.contrib.auth import get_user_model +from django.test import TestCase + +from authens.models import CASAccount, OldCASAccount +from authens.shortcuts import register_cas_account +from authens.tests.cas_utils import FakeLDAPObject + +User = get_user_model() + + +class TestRegisterCasAccount(TestCase): + @mock.patch("authens.shortcuts.ldap.initialize") + def test_register(self, mock_ldap_obj): + mock_ldap_obj.return_value = FakeLDAPObject("johndoe", 2019) + + user = User.objects.create_user(username="whatever") + self.assertFalse(hasattr(user, "cas_account")) + + register_cas_account(user, cas_login="johndoe") + user.refresh_from_db() + self.assertTrue(hasattr(user, "cas_account")) + self.assertEqual(user.cas_account.cas_login, "johndoe") + self.assertEqual(user.cas_account.entrance_year, 2019) + + def test_cant_register_twice(self): + user = User.objects.create_user(username="whatever") + CASAccount.objects.create(user=user, cas_login="johndoe", entrance_year=2019) + + with self.assertRaises(ValueError): + register_cas_account(user, cas_login="johndoe") + with self.assertRaises(ValueError): + register_cas_account(user, cas_login="janisjoplin") + + self.assertEqual(CASAccount.objects.count(), 1) + + def test_cant_register_old_account(self): + user = User.objects.create_user(username="whatever") + OldCASAccount.objects.create(user=user, cas_login="toto", entrance_year=2012) + + with self.assertRaises(ValueError): + register_cas_account(user, cas_login="toto") + with self.assertRaises(ValueError): + register_cas_account(user, cas_login="ninasimone") + + self.assertFalse(CASAccount.objects.exists())