Added a test context manager to log in when doing Flask test client requests

This commit is contained in:
Sybren A. Stüvel 2018-08-30 18:27:55 +02:00
parent 2ad5b20880
commit 791906521f
2 changed files with 31 additions and 0 deletions

View File

@ -210,6 +210,11 @@ def login_user(oauth_token: str, *, load_from_db=False):
user = _load_user(oauth_token) user = _load_user(oauth_token)
else: else:
user = UserClass(oauth_token) user = UserClass(oauth_token)
login_user_object(user)
def login_user_object(user: UserClass):
"""Log in the given user."""
flask_login.login_user(user, remember=True) flask_login.login_user(user, remember=True)
g.current_user = user g.current_user = user
user_authenticated.send(None) user_authenticated.send(None)

View File

@ -1,6 +1,7 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
import base64 import base64
import contextlib
import copy import copy
import datetime import datetime
import json import json
@ -327,6 +328,31 @@ class AbstractPillarTest(TestMinimal):
return user return user
@contextlib.contextmanager
def login_as(self, user_id: typing.Union[str, ObjectId]):
"""Context manager, within the context the app context is active and the user logged in.
The logging-in happens when a request starts, so it's only active when
e.g. self.get() or self.post() or somesuch request is used.
"""
from pillar.auth import UserClass, login_user_object
if isinstance(user_id, str):
user_oid = ObjectId(user_id)
elif isinstance(user_id, ObjectId):
user_oid = user_id
else:
raise TypeError(f'invalid type {type(user_id)} for parameter user_id')
user_doc = self.fetch_user_from_db(user_oid)
def signal_handler(sender, **kwargs):
login_user_object(user)
with self.app.app_context():
user = UserClass.construct('', user_doc)
with flask.request_started.connected_to(signal_handler, self.app):
yield
def create_valid_auth_token(self, user_id, token='token'): def create_valid_auth_token(self, user_id, token='token'):
from pillar.api.utils import utcnow from pillar.api.utils import utcnow