Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

login() in Django testing framework

I have started using Django's testing framework, and everything was working fine until I started testing authenticated pages.

For the sake of simplicity, let's say that this is a test:

class SimpleTest(TestCase):     def setUp(self):         user = User.objects.create_user('temporary', '[email protected]', 'temporary')      def test_secure_page(self):         c = Client()         print c.login(username='temporary', password='temporary')         response = c.get('/users/secure/', follow=True)         user = User.objects.get(username='temporary')         self.assertEqual(response.context['email'], '[email protected]') 

After I run this test, it fails, and I see that printing return value of login() returns True, but response.content gets redirected to login page (if login fails authentication decorator redirects to login page). I have put a break point in decorator that does authentication:

def authenticate(user):     if user.is_authenticated():         return True     return False 

and it really returns False. Line 4 in test_secure_page() properly retrieves user.

This is the view function:

@user_passes_test(authenticate, login_url='/users/login') def secure(request):     user = request.user     return render_to_response('secure.html', {'email': user.email}) 

Of course, if I try to login through application (outside of test), everything works fine.

like image 909
kevin Avatar asked Sep 09 '11 21:09

kevin


People also ask

What test framework does Django use?

The preferred way to write tests in Django is using the unittest module built-in to the Python standard library. This is covered in detail in the Writing and running tests document. You can also use any other Python test framework; Django provides an API and tools for that kind of integration.

What is client in Django test?

The test client. The test client is a Python class that acts as a dummy web browser, allowing you to test your views and interact with your Django-powered application programmatically.


1 Answers

The problem is that you're not passing RequestContext to your template.

Also, you probably should use the login_required decorator and the client built in the TestCase class.

I'd rewrite it like this:

#views.py from django.contrib.auth.decorators import login_required from django.shortcuts import render from django.contrib.auth import get_user_model  @login_required(login_url='/users/login') def secure(request):     user = request.user     return render(request, 'secure.html', {'email': user.email})    #tests.py class SimpleTest(TestCase):     def setUp(self):         User = get_user_model()         user = User.objects.create_user('temporary', '[email protected]', 'temporary')      def test_secure_page(self):         User = get_user_model()         self.client.login(username='temporary', password='temporary')         response = self.client.get('/manufacturers/', follow=True)         user = User.objects.get(username='temporary')         self.assertEqual(response.context['email'], '[email protected]') 
like image 165
Filip Jukić Avatar answered Oct 07 '22 23:10

Filip Jukić