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