Gracefully handle users with empty full_name

This commit is contained in:
Sybren A. Stüvel 2017-12-08 14:03:30 +01:00
parent 821f11393c
commit 8a400c5c0f
2 changed files with 72 additions and 0 deletions

View File

@ -371,6 +371,10 @@ def upsert_user(db_user):
raise wz_exceptions.InternalServerError( raise wz_exceptions.InternalServerError(
'Non-ObjectID string found in user.groups: %s' % db_user) 'Non-ObjectID string found in user.groups: %s' % db_user)
if not db_user['full_name']:
# Blender ID doesn't need a full name, but we do.
db_user['full_name'] = db_user['username']
r = {} r = {}
for retry in range(5): for retry in range(5):
if '_id' in db_user: if '_id' in db_user:

View File

@ -717,6 +717,74 @@ class UserCreationTest(AbstractPillarTest):
db_user = users_coll.find()[0] db_user = users_coll.find()[0]
self.assertEqual(db_user['email'], TEST_EMAIL_ADDRESS) self.assertEqual(db_user['email'], TEST_EMAIL_ADDRESS)
@responses.activate
def test_create_by_auth_no_full_name(self):
"""Blender ID does not require full name, we do."""
with self.app.test_request_context():
users_coll = self.app.db().users
self.assertEqual(0, users_coll.count())
bid_resp = {'status': 'success',
'user': {'email': TEST_EMAIL_ADDRESS,
'full_name': '',
'id': ctd.BLENDER_ID_TEST_USERID},
'token_expires': 'Mon, 1 Jan 2218 01:02:03 GMT'}
responses.add(responses.POST,
'%s/u/validate_token' % self.app.config['BLENDER_ID_ENDPOINT'],
json=bid_resp,
status=200)
token = 'this is my life now'
self.get('/api/users/me', auth_token=token)
with self.app.test_request_context():
users_coll = self.app.db().users
self.assertEqual(1, users_coll.count())
db_user = users_coll.find()[0]
self.assertEqual(db_user['email'], TEST_EMAIL_ADDRESS)
self.assertNotEqual('', db_user['full_name'])
@responses.activate
def test_update_by_auth_no_full_name(self):
"""Blender ID does not require full name, we do."""
self.enter_app_context()
users_coll = self.app.db().users
self.assertEqual(0, users_coll.count())
# First request will create the user, the 2nd request will update.
self.mock_blenderid_validate_happy()
bid_resp = {'status': 'success',
'user': {'email': TEST_EMAIL_ADDRESS,
'full_name': '',
'id': ctd.BLENDER_ID_TEST_USERID},
'token_expires': 'Mon, 1 Jan 2218 01:02:03 GMT'}
responses.add(responses.POST,
'%s/u/validate_token' % self.app.config['BLENDER_ID_ENDPOINT'],
json=bid_resp,
status=200)
token = 'this is my life now'
self.get('/api/users/me', auth_token=token)
# Clear out the full name of the user. This could happen for some
# reason, and it shouldn't break the login flow.
users_coll.update_many({}, {'$set': {'full_name': ''}})
# Delete all tokens to force a re-check with Blender ID
tokens_coll = self.app.db('tokens')
tokens_coll.delete_many({})
self.get('/api/users/me', auth_token=token)
self.assertEqual(1, users_coll.count())
db_user = users_coll.find()[0]
self.assertEqual(db_user['email'], TEST_EMAIL_ADDRESS)
self.assertNotEqual('', db_user['full_name'])
def test_user_without_email_address(self): def test_user_without_email_address(self):
"""Regular users should always have an email address. """Regular users should always have an email address.