diff --git a/server/users/mutations_public.py b/server/users/mutations_public.py index 50c74d0a..4dc03bb9 100644 --- a/server/users/mutations_public.py +++ b/server/users/mutations_public.py @@ -54,6 +54,12 @@ class Login(relay.ClientIDMutation): user, status_msg = handle_user_and_verify_products(user_data) + # sync email if user changed it on hep account + if user.email != user_data['email']: + user.email = user_data['email'] + user.username = user_data['email'] + user.save() + if user and status_msg != EMAIL_NOT_VERIFIED: login(info.context, user) diff --git a/server/users/tests/test_login.py b/server/users/tests/test_login.py index 2ee8c069..c6317916 100644 --- a/server/users/tests/test_login.py +++ b/server/users/tests/test_login.py @@ -30,10 +30,9 @@ from users.models import Role, User, SchoolClass TOKEN = 'abcd12345!' - class PasswordResetTests(TestCase): def setUp(self): - self.user = UserFactory(username='aschi@iterativ.ch', email='aschi@iterativ.ch') + self.user = UserFactory(username=ME_DATA['id'], email=ME_DATA['id']) Role.objects.create_default_roles() self.teacher_role = Role.objects.get_default_teacher_role() @@ -80,6 +79,44 @@ class PasswordResetTests(TestCase): self.assertTrue(result.get('data').get('login').get('success')) self.assertTrue(self.user.is_authenticated) + @patch.object(HepClient, 'customer_me', return_value=ME_DATA) + def test_user_can_login_with_updated_email(self, me_mock): + + old_mail = 'aschi@iterativ.ch' + + self.user.hep_id = ME_DATA['id'] + self.user.email = old_mail + self.user.username = old_mail + self.user.save() + + now = timezone.now() + expiry_date = now + timedelta(365) + LicenseFactory(expire_date=expiry_date, licensee=self.user, for_role=self.teacher_role).save() + + result = self.make_login_mutation(self.user.email, TOKEN) + + user = User.objects.get(hep_id=self.user.hep_id) + + self.assertEqual(user.username, ME_DATA['email']) + self.assertEqual(user.email, ME_DATA['email']) + self.assertTrue(result.get('data').get('login').get('success')) + self.assertTrue(self.user.is_authenticated) + + @patch.object(HepClient, 'customer_me', return_value=ME_DATA) + def test_user_can_login_with_local_user_and_valid_local_license(self, me_mock): + + self.user.hep_id = ME_DATA['id'] + self.user.save() + + now = timezone.now() + expiry_date = now + timedelta(365) + LicenseFactory(expire_date=expiry_date, licensee=self.user, for_role=self.teacher_role).save() + + result = self.make_login_mutation(self.user.email, TOKEN) + + self.assertTrue(result.get('data').get('login').get('success')) + self.assertTrue(self.user.is_authenticated) + @patch.object(HepClient, '_customer_orders', return_value=VALID_TEACHERS_ORDERS) @patch.object(HepClient, 'customer_me', return_value=ME_DATA) @patch.object(HepClient, 'fetch_admin_token', return_value={'token': 'AABBCCDDEE**44566'}) @@ -171,14 +208,3 @@ class PasswordResetTests(TestCase): self.assertFalse(result.get('data').get('login').get('success')) self.assertEqual(result.get('data').get('login').get('errors')[0].get('field'), 'unknown_error') - - ## can login with license and user - ## can login with no user and license - # ?can login with no user and local license - ## cannot login without user - ## cannot login with user and not verfied - ## cannot login with user and no license - ## cannot login with user and expired license - ## non 200 error - # if more than one valid license take correct - # if mulitple licenses and one correct take one test in own class diff --git a/server/users/user_signup_login_handler.py b/server/users/user_signup_login_handler.py index 82fdc8b3..6408d07a 100644 --- a/server/users/user_signup_login_handler.py +++ b/server/users/user_signup_login_handler.py @@ -19,6 +19,7 @@ EMAIL_NOT_VERIFIED = 'email_not_verified' UNKNOWN_ERROR = 'unknown_error' NO_VALID_LICENSE = 'no_valid_license' + def handle_user_and_verify_products(user_data): hep_client = HepClient()