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.