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.
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.
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.
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]')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With