Testing User Sessions with Flask Elegantly
Thursday, August 17th, 2017There is excellent information available on testing Flask e.g. http://flask.pocoo.org/docs/0.12/testing/
One thing I ran into was the need to set up a user session for most of my test cases.
The documentation suggests something like:
with app.test_client() as c: with c.session_transaction() as sess: sess['a_key'] = 'a value'
but repeating that in every test case (especially with a bit more code to set up the session) is not really DRY.
Now the same documentation suggests a very elegant trick using context managers for setting up users on the global object:
from contextlib import contextmanager from flask import appcontext_pushed, g @contextmanager def user_set(app, user): def handler(sender, **kwargs): g.user = user with appcontext_pushed.connected_to(handler, app): yield
Inspired by this, I figured that they can be combined into:
@contextmanager def user_set(app, user): with app.test_client() as c: with c.session_transaction() as sess: start_user_session(sess, user) yield c
and then use it in a test like:
user = ... with user_set(app, user) as client: client.get('/logged_in_resource')