83π
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.
109π
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
- [Django]-Querying django migrations table
- [Django]-@csrf_exempt does not work on generic view based class
- [Django]-Pycharm error Django is not importable in this environment
11π
Djangoβs TestClient has a login method which returns True if the user was successfully logged in.
- [Django]-How do I use pagination with Django class based generic ListViews?
- [Django]-How to mix queryset results?
- [Django]-Django admin file upload with current model id
9π
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
).
- [Django]-__init__() got an unexpected keyword argument 'mimetype'
- [Django]-How to get the domain name of my site within a Django template?
- [Django]-Django, creating a custom 500/404 error page
2π
Where are you initialising your self.client
? What else is in your setUp
method? I have a similar test and your code should work fine. Hereβs how I do it:
from django.contrib.auth.models import User
from django.test import TestCase
from django.test.client import Client
class UserTestCase(TestCase):
def setUp(self):
self.client = Client()
def testLogin(self):
print User.objects.all() # returns []
response = self.client.post(reverse('auth-registration'),
{ 'username':'foo',
'password1':'bar',
'password2':'bar' } )
print User.objects.all() # returns one user
print User.objects.all()[0].is_authenticated() # returns True
EDIT
If I comment out my login logic, I donβt get any User after self.client.post(
. If you really want to check if the user has been authenticated, use the self.client
to access another url which requires user authentication. Continuing from the above, access another page:
response = self.client.get(reverse('another-page-which-requires-authentication'))
print response.status_code
The above should return 200 to confirm that the user has authenticated. Anything else, it will redirect to the login page with a 302 code.
- [Django]-Include intermediary (through model) in responses in Django Rest Framework
- [Django]-Are there any plans to officially support Django with IIS?
- [Django]-Django can' t load Module 'debug_toolbar': No module named 'debug_toolbar'
2π
There is another succinct way, using wsgi_request
in response
:
response = self.client.post('/signup', data)
assert response.wsgi_request.user.is_authenticated()
and @Chronial βs manner is also available with wsgi_request
:
from django.contrib import auth
user = auth.get_user(response.wsgi_request)
assert user.is_authenticated()
Because response.wsgi_request
object has a session
attribute.
However, I think using response.wsgi_request.user
is more simple.
- [Django]-How to revert the last migration?
- [Django]-How to get an ImageField URL within a template?
- [Django]-How can I use the variables from "views.py" in JavasScript, "<script></script>" in a Django template?