Testing Flask login and authentication?
flask, flask-login, flask-security, python, unit-testing
Solution
The problem is that the `test_client.get()` call causes a new request context to be pushed, so the one you pushed in your the `setUp()` method of your test case is not the one that the `/user` handler sees.
I think the approach shown in the Logging In and Out and Test Adding Messages sections of the documentation is the best approach for testing logins. The idea is to send the login request through the application, like a regular client would. This will take care of registering the logged in user in the user session of the test client.
Problem
I'm developing a Flask application and using Flask-security for user authentication (which in turn uses Flask-login underneath). I have a route which requires authentication, `/user`. I'm trying to write a unit test which tests that, for an authenticated user, this returns the appropriate response. In my unittest I'm creating a user and logging as that user like so: ``` from unittest import TestCase from app import app, db from models import User from flask_security.utils import login_user class UserTest(TestCase): def setUp(self): self.app = app self.client = self.app.test_client() self._ctx = self.app.test_request_context() self._ctx.push() db.create_all() def tearDown(self): if self._ctx is not None: self._ctx.pop() db.session.remove() db.drop_all() def test_user_authentication(): # (the test case is within a test request context) user = User(active=True) db.session.add(user) db.session.commit() login_user(user) # current_user here is the user print(current_user) # current_user within this request is an anonymous user r = test_client.get('/user') ``` Within the test `current_user` returns the correct user. However, the requested view always returns an `AnonymousUser` as the `current_user`. The `/user` route is defined as: ``` class CurrentUser(Resource): def get(self): return current_user # returns an AnonymousUser ``` I'm fairly certain I'm just not fully understanding how testing Flask request contexts work. I've read this Flask Request Context documentation a bunch but am still not understanding how to approach this particular unit test.