1
+ import uuid
2
+
3
+ from sqlalchemy_utils import database_exists , drop_database , create_database
4
+
1
5
from chrononaut .flask_versioning import UTC
2
6
from datetime import datetime
3
7
import os
4
8
from enum import Enum
5
9
6
10
import flask
7
- from flask import g , _request_ctx_stack
11
+ from flask import g
8
12
import flask_security
9
- import flask_sqlalchemy
10
13
import sqlalchemy
11
14
import random
12
15
import string
@@ -36,19 +39,17 @@ def app(request):
36
39
37
40
38
41
@pytest .fixture (scope = "session" )
39
- def unversioned_db (app , request ):
40
- """An unversioned db fixture."""
41
- db = flask_sqlalchemy .SQLAlchemy (app )
42
- yield db
43
-
44
-
45
- @pytest .fixture (scope = "session" )
46
- def db (app , request ):
42
+ def db (app ):
47
43
"""A versioned db fixture."""
48
44
db = chrononaut .VersionedSQLAlchemy (app )
49
45
models = generate_test_models (db )
50
46
for model in models :
51
47
setattr (db , model .__name__ , model )
48
+ if database_exists (db .engine .url ):
49
+ db .engine .dispose ()
50
+ drop_database (db .engine .url )
51
+
52
+ create_database (db .engine .url )
52
53
db .create_all ()
53
54
try :
54
55
yield db
@@ -170,6 +171,9 @@ def validate_title(self, k, v):
170
171
db .Column ("role_id" , db .Integer (), db .ForeignKey ("role.id" )),
171
172
)
172
173
174
+ def gen_fs_uniquifier () -> str :
175
+ return str (uuid .uuid4 ())
176
+
173
177
class Role (db .Model , flask_security .RoleMixin , chrononaut .Versioned ):
174
178
id = db .Column (db .Integer , primary_key = True )
175
179
name = db .Column (db .String (80 ), unique = True )
@@ -187,6 +191,9 @@ class User(db.Model, flask_security.UserMixin, chrononaut.Versioned):
187
191
roles = db .relationship (
188
192
"Role" , secondary = roles_users , backref = db .backref ("users" , lazy = "dynamic" )
189
193
)
194
+ fs_uniquifier = db .Column (
195
+ db .String (255 ), unique = True , nullable = False , default = gen_fs_uniquifier
196
+ )
190
197
191
198
class ChangeLog (db .Model , chrononaut .RecordChanges , chrononaut .Versioned ):
192
199
id = db .Column (db .Integer , primary_key = True )
@@ -202,7 +209,7 @@ def session(db):
202
209
transaction = connection .begin ()
203
210
204
211
options = dict (bind = connection , binds = {})
205
- session = db .create_scoped_session (options = options )
212
+ session = db ._make_scoped_session (options = options )
206
213
session .begin_nested ()
207
214
208
215
# session is actually a scoped_session
@@ -242,16 +249,6 @@ def app_client(security_app):
242
249
yield security_app .test_client (use_cookies = True )
243
250
244
251
245
- @pytest .fixture (scope = "function" )
246
- def user (db , session ):
247
- user = db .User (email = "test@example.com" , password = "password" , active = True )
248
- role = db .Role (name = "Admin" )
249
- session .add (user )
250
- session .add (role )
251
- session .commit ()
252
- yield user
253
-
254
-
255
252
@pytest .fixture (scope = "function" )
256
253
def anonymous_user (app_client ):
257
254
with app_client :
@@ -261,19 +258,18 @@ def anonymous_user(app_client):
261
258
262
259
263
260
@pytest .fixture (scope = "function" )
264
- def logged_in_user (security_app , user ):
261
+ def logged_in_user (security_app , db , session ):
265
262
with security_app .test_request_context (environ_base = {"REMOTE_ADDR" : "10.0.0.1" }):
266
- original = security_app .login_manager ._load_user
267
- if hasattr (g , "_login_user" ):
268
- delattr (g , "_login_user" )
269
-
270
- def _load_user_from_request ():
271
- _request_ctx_stack .top .user = user
272
- g ._login_user = user
273
- return user
274
-
275
- security_app .login_manager ._load_user = _load_user_from_request
263
+ user = db .User (email = "test@example.com" , password = "password" , active = True )
264
+ role = db .Role (name = "Admin" )
265
+ session .add (user )
266
+ session .add (role )
267
+ session .commit ()
268
+
269
+ security_app .login_manager ._update_request_context_with_user (user )
270
+ g ._login_user = user
276
271
try :
277
272
yield user
278
273
finally :
279
- security_app .login_manager ._load_user = original
274
+ delattr (g , "_login_user" )
275
+ security_app .login_manager ._update_request_context_with_user (None )
0 commit comments