Handle network error

This commit is contained in:
Christian Cueni 2020-01-29 10:10:45 +01:00
parent c13ed2a5b2
commit dbc4f6f2ee
2 changed files with 28 additions and 47 deletions

View File

@ -13,7 +13,7 @@ from django.conf import settings
from django.contrib.auth import authenticate, login
from graphene import relay
from core.hep_client import HepClient, HepClientUnauthorizedException
from core.hep_client import HepClient, HepClientUnauthorizedException, HepClientException
from registration.models import License
from users.models import MagentoToken, User, Role, UserRole, SchoolClass
@ -39,8 +39,7 @@ class Login(relay.ClientIDMutation):
if settings.USE_LOCAL_REGISTRATION:
user = authenticate(username=username, password=password)
if user is None:
error = LoginError(field='invalid_credentials')
return cls(success=False, errors=[error])
return cls.return_login_error('invalid_credentials')
else:
hep_client = HepClient()
@ -48,8 +47,9 @@ class Login(relay.ClientIDMutation):
try:
token = hep_client.customer_token(username, password)
except HepClientUnauthorizedException:
error = LoginError(field='invalid_credentials')
return cls(success=False, errors=[error])
return cls.return_login_error('invalid_credentials')
except HepClientException:
return cls.return_login_error('unknown_error')
try:
user = User.objects.get(email=username)
@ -60,23 +60,27 @@ class Login(relay.ClientIDMutation):
magento_token.token = token['token']
magento_token.save()
if not hep_client.is_email_verified(username):
error = LoginError(field='email_not_verified')
return cls(success=False, errors=[error])
try:
if not hep_client.is_email_verified(username):
return cls.return_login_error('email_not_verified')
except HepClientException:
return cls.return_login_error('unknown_error')
try:
license = License.objects.get(licensee=user)
# Todo how handle invalid license? Cron Job? How to select correct license? Save all licenses? History?
except License.DoesNotExist:
product = hep_client.myskillbox_product_for_customer(settings.HEP_ADMIN_TOKEN, user.hep_id)
try:
product = hep_client.myskillbox_product_for_customer(settings.HEP_ADMIN_TOKEN, user.hep_id)
except HepClientException:
return cls.return_login_error('unknown_error')
if product:
license = License.objects.create_license_for_role(user, product['activated'],
product['raw'], product['edition'])
# todo handle no license case
else:
error = LoginError(field='no_valid_license')
return cls(success=False, errors=[error])
return cls.return_login_error('no_valid_license')
UserRole.objects.create_role_for_user(user, license.for_role.key)
@ -84,14 +88,16 @@ class Login(relay.ClientIDMutation):
SchoolClass.create_default_group_for_teacher(user)
if not license.is_valid():
error = LoginError(field='no_valid_license')
return cls(success=False, errors=[error])
return cls.return_login_error('no_valid_license')
login(info.context, user)
return cls(success=True, errors=[])
@classmethod
def return_login_error(cls, message):
error = LoginError(field=message)
return cls(success=False, errors=[error])
class UserMutations:
login = Login.Field()

View File

@ -205,6 +205,12 @@ class PasswordResetTests(TestCase):
self.assertFalse(result.get('data').get('login').get('success'))
self.assertEqual(result.get('data').get('login').get('errors')[0].get('field'), 'no_valid_license')
@patch.object(requests, 'post', return_value=MockResponse(500))
def test_user_gets_notified_if_server_error(self, post_mock):
result = self.make_login_mutation(ME_DATA['email'], 'test123')
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
@ -213,37 +219,6 @@ class PasswordResetTests(TestCase):
## cannot login with user and not verfied
## cannot login with user and no license
## cannot login with user and expired license
# non 200 error
## non 200 error
# if more than one valid license take correct
# if mulitple licenses and one correct take one test in own class
# def test_user_cannot_login_with_invalid_password(self):
# password = 'test123'
# self.user.set_password(password)
# self.user.save()
#
# result = self.make_login_mutation(self.user.email, 'test1234')
# self.assertFalse(result.get('data').get('login').get('success'))
#
# def test_user_with_active_license_can_login(self):
# password = 'test123'
# self.user.set_password(password)
# self.user.save()
#
# LicenseFactory(license_type=self.teacher_license_type, licensee=self.user)
#
# result = self.make_login_mutation(self.user.email, password)
# self.assertTrue(result.get('data').get('login').get('success'))
#
# def test_user_with_inactive_license_cannot_login(self):
# password = 'test123'
# self.user.set_password(password)
# self.user.save()
#
# self.teacher_license_type.active = False
# self.teacher_license_type.save()
# LicenseFactory(license_type=self.teacher_license_type, licensee=self.user)
#
# result = self.make_login_mutation(self.user.email, password)
# self.assertFalse(result.get('data').get('login').get('success'))