Improve user creation logic

This commit is contained in:
Tim Van Baak 2021-05-06 11:14:33 -07:00
parent 8a3893f33d
commit 4c3dcfe0e5
2 changed files with 19 additions and 4 deletions

View File

@ -5,6 +5,8 @@ User query interface
import re import re
import uuid import uuid
from sqlalchemy import select, func
from amanuensis.db import DbContext, User from amanuensis.db import DbContext, User
from amanuensis.errors import ArgumentError from amanuensis.errors import ArgumentError
@ -30,11 +32,11 @@ def create_user(
if not password: if not password:
raise ArgumentError('Password must be provided') raise ArgumentError('Password must be provided')
# If display name is not provided, use the username # If display name is not provided, use the username
if not display_name.strip(): if not display_name or not display_name.strip():
display_name = username display_name = username
# Query the db to make sure the username isn't taken # Query the db to make sure the username isn't taken
if db.session.query(User.username == username).count() > 0: if db.session.query(func.count(User.id)).filter(User.username == username).scalar() > 0:
raise ArgumentError('Username is already taken') raise ArgumentError('Username is already taken')
new_user = User( new_user = User(

View File

@ -27,7 +27,7 @@ def test_create(db):
def test_create_user(db): def test_create_user(db):
"""New user creation""" """Test new user creation."""
kwargs = { kwargs = {
'username': 'username', 'username': 'username',
'password': 'password', 'password': 'password',
@ -36,16 +36,29 @@ def test_create_user(db):
'is_site_admin': False 'is_site_admin': False
} }
# Test length constraints
with pytest.raises(ArgumentError):
userq.create_user(db, **{**kwargs, 'username': 'me'})
with pytest.raises(ArgumentError):
userq.create_user(db, **{**kwargs, 'username': 'the right honorable user-name, esquire'})
# Test allowed characters
with pytest.raises(ArgumentError): with pytest.raises(ArgumentError):
userq.create_user(db, **{**kwargs, 'username': 'user name'}) userq.create_user(db, **{**kwargs, 'username': 'user name'})
# No password
with pytest.raises(ArgumentError): with pytest.raises(ArgumentError):
userq.create_user(db, **{**kwargs, 'password': None}) userq.create_user(db, **{**kwargs, 'password': None})
# Valid creation works and populates fields
new_user = userq.create_user(db, **kwargs) new_user = userq.create_user(db, **kwargs)
assert new_user assert new_user
assert new_user.id is not None assert new_user.id is not None
assert new_user.created is not None assert new_user.created is not None
# No duplicate usernames
with pytest.raises(ArgumentError): with pytest.raises(ArgumentError):
duplicate = userq.create_user(db, **kwargs) duplicate = userq.create_user(db, **kwargs)
# Missing display name populates with username
user2_kw = {**kwargs, 'username': 'user2', 'display_name': None}
user2 = userq.create_user(db, **user2_kw)
assert user2.display_name is not None