Test that user was logged in successfully

Django's TestClient has a login method which returns True if the user was successfully logged in.


You can use the get_user method of the auth module. It says it wants a request as parameter, but it only ever uses the session attribute of the request. And it just so happens that our Client has that attribute.

from django.contrib import auth
user = auth.get_user(self.client)
assert user.is_authenticated

The method is_authenticated() on the User model always returns True. False is returned for request.user.is_authenticated() in the case that request.user is an instance of AnonymousUser, which is_authenticated() method always returns False. While testing you can have a look at response.context['request'].user.is_authenticated().

You can also try to access another page in test which requires to be logged in, and see if response.status returns 200 or 302 (redirect from login_required).


This is not the best answer. See https://stackoverflow.com/a/35871564/307511

Chronial has given an excellent example on how to make this assertion below. His answer better than mine for nowadays code.


The most straightforward method to test if a user is logged in is by testing the Client object:

self.assertIn('_auth_user_id', self.client.session)

You could also check if a specific user is logged in:

self.assertEqual(int(self.client.session['_auth_user_id']), user.pk)

As an additional info, the response.request object is not a HttpRequest object; instead, it's an ordinary dict with some info about the actual request, so it won't have the user attribute anyway.

Also, testing the response.context object is not safe because you don't aways have a context.

Tags:

Django