Skip to content
This repository has been archived by the owner on Jul 30, 2024. It is now read-only.

Commit

Permalink
add tests for user model without roles attr
Browse files Browse the repository at this point in the history
  • Loading branch information
Jaza committed Dec 22, 2018
1 parent 73e68fc commit 810e365
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 5 deletions.
22 changes: 17 additions & 5 deletions flask_security/datastore.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,14 +125,26 @@ def _prepare_role_modify_args(self, user, role):

def _prepare_create_user_args(self, **kwargs):
kwargs.setdefault('active', True)
roles = kwargs.get('roles', [])

if hasattr(self.user_model, 'roles'):
roles = kwargs.get('roles', [])
for i, role in enumerate(roles):
if not hasattr(self.user_model, 'roles') and roles:
raise ValueError((
'Cannot create user with roles %s, because the user '
'model has no "roles" attribute') % str(roles))

if roles:
roles_to_add = []

for role in roles:
rn = role.name if isinstance(role, self.role_model) else role

# see if the role exists
roles[i] = self.find_role(rn)
kwargs['roles'] = roles
role_to_add = self.find_role(rn)

if role_to_add:
roles_to_add.append(role_to_add)

kwargs['roles'] = roles_to_add

return kwargs

Expand Down
38 changes: 38 additions & 0 deletions tests/test_datastore.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,19 @@ class Role(RoleMixin):
pass


class FakeUserDatastore(UserDatastore):
def find_role(self, role_name):
return role_name if role_name != 'lordofchaos' else None


class FakeUserModel(object):
roles = 'ABC'


class FakeUserModelWithoutRoles(object):
pass


def test_unimplemented_datastore_methods():
datastore = Datastore(None)
assert datastore.db is None
Expand Down Expand Up @@ -183,3 +196,28 @@ def test_init_app_kwargs_override_constructor_kwargs(app, datastore):

assert security.login_form == 'init_app_login_form'
assert security.register_form == '__init__register_form'


def test_prepare_create_user_args_with_roles():
datastore = FakeUserDatastore(FakeUserModel(), type(None))
roles = ['godofthunder', 'lordofchaos', 'majordufus']

create_kwargs = datastore._prepare_create_user_args(roles=roles)

assert create_kwargs == {
'active': True, 'roles': ['godofthunder', 'majordufus']}


def test_prepare_create_user_args_without_roles():
datastore = FakeUserDatastore(FakeUserModel(), type(None))

create_kwargs = datastore._prepare_create_user_args(active=False)

assert create_kwargs == {'active': False}


def test_prepare_create_user_args_without_usermodel_roles():
datastore = FakeUserDatastore(FakeUserModelWithoutRoles(), type(None))

with raises(ValueError):
datastore._prepare_create_user_args(roles=['hippotamer'])

0 comments on commit 810e365

Please sign in to comment.