1# -*- coding: utf-8 -*- 2""" 3 test_datastore 4 ~~~~~~~~~~~~~~ 5 6 Datastore tests 7""" 8 9from pytest import raises 10from utils import init_app_with_options 11 12from flask_security import RoleMixin, Security, UserMixin 13from flask_security.datastore import Datastore, UserDatastore 14 15 16class User(UserMixin): 17 pass 18 19 20class Role(RoleMixin): 21 pass 22 23 24def test_unimplemented_datastore_methods(): 25 datastore = Datastore(None) 26 assert datastore.db is None 27 with raises(NotImplementedError): 28 datastore.put(None) 29 with raises(NotImplementedError): 30 datastore.delete(None) 31 assert not datastore.commit() 32 33 34def test_unimplemented_user_datastore_methods(): 35 datastore = UserDatastore(None, None) 36 with raises(NotImplementedError): 37 datastore.find_user(None) 38 with raises(NotImplementedError): 39 datastore.find_role(None) 40 with raises(NotImplementedError): 41 datastore.get_user(None) 42 43 44def test_toggle_active(): 45 datastore = UserDatastore(None, None) 46 user = User() 47 user.active = True 48 assert datastore.toggle_active(user) is True 49 assert not user.active 50 assert datastore.toggle_active(user) is True 51 assert user.active is True 52 53 54def test_deactivate_user(): 55 datastore = UserDatastore(None, None) 56 user = User() 57 user.active = True 58 assert datastore.deactivate_user(user) is True 59 assert not user.active 60 61 62def test_activate_user(): 63 datastore = UserDatastore(None, None) 64 user = User() 65 user.active = False 66 assert datastore.activate_user(user) is True 67 assert user.active is True 68 69 70def test_deactivate_returns_false_if_already_false(): 71 datastore = UserDatastore(None, None) 72 user = User() 73 user.active = False 74 assert not datastore.deactivate_user(user) 75 76 77def test_activate_returns_false_if_already_true(): 78 datastore = UserDatastore(None, None) 79 user = User() 80 user.active = True 81 assert not datastore.activate_user(user) 82 83 84def test_get_user(app, datastore): 85 init_app_with_options(app, datastore, **{ 86 'SECURITY_USER_IDENTITY_ATTRIBUTES': ('email', 'username') 87 }) 88 89 with app.app_context(): 90 user_id = datastore.find_user(email='matt@lp.com').id 91 92 user = datastore.get_user(user_id) 93 assert user is not None 94 95 user = datastore.get_user('matt@lp.com') 96 assert user is not None 97 98 user = datastore.get_user('matt') 99 assert user is not None 100 101 # Regression check 102 user = datastore.get_user('%lp.com') 103 assert user is None 104 105 106def test_find_role(app, datastore): 107 init_app_with_options(app, datastore) 108 109 with app.app_context(): 110 role = datastore.find_role('admin') 111 assert role is not None 112 113 role = datastore.find_role('bogus') 114 assert role is None 115 116 117def test_add_role_to_user(app, datastore): 118 init_app_with_options(app, datastore) 119 120 with app.app_context(): 121 # Test with user object 122 user = datastore.find_user(email='matt@lp.com') 123 assert user.has_role('editor') is False 124 assert datastore.add_role_to_user(user, 'editor') is True 125 assert datastore.add_role_to_user(user, 'editor') is False 126 assert user.has_role('editor') is True 127 128 # Test with email 129 assert datastore.add_role_to_user('jill@lp.com', 'editor') is True 130 user = datastore.find_user(email='jill@lp.com') 131 assert user.has_role('editor') is True 132 133 # Test remove role 134 assert datastore.remove_role_from_user(user, 'editor') is True 135 assert datastore.remove_role_from_user(user, 'editor') is False 136 137 138def test_create_user_with_roles(app, datastore): 139 init_app_with_options(app, datastore) 140 141 with app.app_context(): 142 role = datastore.find_role('admin') 143 datastore.commit() 144 145 user = datastore.create_user(email='dude@lp.com', username='dude', 146 password='password', roles=[role]) 147 datastore.commit() 148 user = datastore.find_user(email='dude@lp.com') 149 assert user.has_role('admin') is True 150 151 152def test_delete_user(app, datastore): 153 init_app_with_options(app, datastore) 154 155 with app.app_context(): 156 user = datastore.find_user(email='matt@lp.com') 157 datastore.delete_user(user) 158 datastore.commit() 159 user = datastore.find_user(email='matt@lp.com') 160 assert user is None 161 162 163def test_access_datastore_from_factory(app, datastore): 164 security = Security() 165 security.init_app(app, datastore) 166 167 assert security.datastore is not None 168 assert security.app is not None 169