2008-08-04 03:55:26 +08:00
|
|
|
"""
|
|
|
|
Tests for Django's bundled context processors.
|
|
|
|
"""
|
2010-10-11 20:20:07 +08:00
|
|
|
import warnings
|
2008-08-04 03:55:26 +08:00
|
|
|
|
|
|
|
from django.conf import settings
|
2009-10-20 22:11:08 +08:00
|
|
|
from django.contrib.auth import authenticate
|
2009-10-20 05:13:22 +08:00
|
|
|
from django.db.models import Q
|
2008-08-04 03:55:26 +08:00
|
|
|
from django.test import TestCase
|
2009-10-15 22:12:34 +08:00
|
|
|
from django.template import Template
|
2008-08-04 03:55:26 +08:00
|
|
|
|
|
|
|
class RequestContextProcessorTests(TestCase):
|
|
|
|
"""
|
|
|
|
Tests for the ``django.core.context_processors.request`` processor.
|
|
|
|
"""
|
|
|
|
|
|
|
|
urls = 'regressiontests.context_processors.urls'
|
|
|
|
|
|
|
|
def test_request_attributes(self):
|
|
|
|
"""
|
|
|
|
Test that the request object is available in the template and that its
|
|
|
|
attributes can't be overridden by GET and POST parameters (#3828).
|
|
|
|
"""
|
|
|
|
url = '/request_attrs/'
|
|
|
|
# We should have the request object in the template.
|
|
|
|
response = self.client.get(url)
|
|
|
|
self.assertContains(response, 'Have request')
|
|
|
|
# Test is_secure.
|
|
|
|
response = self.client.get(url)
|
|
|
|
self.assertContains(response, 'Not secure')
|
|
|
|
response = self.client.get(url, {'is_secure': 'blah'})
|
|
|
|
self.assertContains(response, 'Not secure')
|
|
|
|
response = self.client.post(url, {'is_secure': 'blah'})
|
|
|
|
self.assertContains(response, 'Not secure')
|
|
|
|
# Test path.
|
|
|
|
response = self.client.get(url)
|
|
|
|
self.assertContains(response, url)
|
|
|
|
response = self.client.get(url, {'path': '/blah/'})
|
|
|
|
self.assertContains(response, url)
|
|
|
|
response = self.client.post(url, {'path': '/blah/'})
|
|
|
|
self.assertContains(response, url)
|
2009-10-15 02:09:13 +08:00
|
|
|
|
|
|
|
class AuthContextProcessorTests(TestCase):
|
|
|
|
"""
|
2010-02-22 07:40:47 +08:00
|
|
|
Tests for the ``django.contrib.auth.context_processors.auth`` processor
|
2009-10-15 02:09:13 +08:00
|
|
|
"""
|
|
|
|
urls = 'regressiontests.context_processors.urls'
|
|
|
|
fixtures = ['context-processors-users.xml']
|
|
|
|
|
2010-10-11 20:20:07 +08:00
|
|
|
def setUp(self):
|
2010-11-11 23:06:20 +08:00
|
|
|
self.save_warnings_state()
|
2010-10-11 20:20:07 +08:00
|
|
|
warnings.filterwarnings('ignore', category=DeprecationWarning,
|
|
|
|
module='django.contrib.auth.models')
|
|
|
|
warnings.filterwarnings('ignore', category=DeprecationWarning,
|
|
|
|
module='django.core.context_processors')
|
|
|
|
|
|
|
|
def tearDown(self):
|
2010-11-11 23:06:20 +08:00
|
|
|
self.restore_warnings_state()
|
2010-10-11 20:20:07 +08:00
|
|
|
|
2009-10-15 02:09:13 +08:00
|
|
|
def test_session_not_accessed(self):
|
|
|
|
"""
|
|
|
|
Tests that the session is not accessed simply by including
|
|
|
|
the auth context processor
|
|
|
|
"""
|
|
|
|
response = self.client.get('/auth_processor_no_attr_access/')
|
|
|
|
self.assertContains(response, "Session not accessed")
|
|
|
|
|
|
|
|
def test_session_is_accessed(self):
|
|
|
|
"""
|
|
|
|
Tests that the session is accessed if the auth context processor
|
|
|
|
is used and relevant attributes accessed.
|
|
|
|
"""
|
|
|
|
response = self.client.get('/auth_processor_attr_access/')
|
|
|
|
self.assertContains(response, "Session accessed")
|
|
|
|
|
|
|
|
def test_perms_attrs(self):
|
|
|
|
self.client.login(username='super', password='secret')
|
|
|
|
response = self.client.get('/auth_processor_perms/')
|
|
|
|
self.assertContains(response, "Has auth permissions")
|
|
|
|
|
|
|
|
def test_message_attrs(self):
|
|
|
|
self.client.login(username='super', password='secret')
|
|
|
|
response = self.client.get('/auth_processor_messages/')
|
|
|
|
self.assertContains(response, "Message 1")
|
|
|
|
|
|
|
|
def test_user_attrs(self):
|
|
|
|
"""
|
2009-10-20 22:11:08 +08:00
|
|
|
Test that the lazy objects returned behave just like the wrapped objects.
|
2009-10-15 02:09:13 +08:00
|
|
|
"""
|
2009-10-20 22:11:08 +08:00
|
|
|
# These are 'functional' level tests for common use cases. Direct
|
|
|
|
# testing of the implementation (SimpleLazyObject) is in the 'utils'
|
|
|
|
# tests.
|
2009-10-15 02:09:13 +08:00
|
|
|
self.client.login(username='super', password='secret')
|
2009-10-20 22:11:08 +08:00
|
|
|
user = authenticate(username='super', password='secret')
|
2009-10-15 02:09:13 +08:00
|
|
|
response = self.client.get('/auth_processor_user/')
|
|
|
|
self.assertContains(response, "unicode: super")
|
|
|
|
self.assertContains(response, "id: 100")
|
|
|
|
self.assertContains(response, "username: super")
|
2009-10-15 22:12:34 +08:00
|
|
|
# bug #12037 is tested by the {% url %} in the template:
|
|
|
|
self.assertContains(response, "url: /userpage/super/")
|
2009-10-20 05:13:22 +08:00
|
|
|
|
|
|
|
# See if this object can be used for queries where a Q() comparing
|
|
|
|
# a user can be used with another Q() (in an AND or OR fashion).
|
|
|
|
# This simulates what a template tag might do with the user from the
|
|
|
|
# context. Note that we don't need to execute a query, just build it.
|
|
|
|
#
|
|
|
|
# The failure case (bug #12049) on Python 2.4 with a LazyObject-wrapped
|
|
|
|
# User is a fatal TypeError: "function() takes at least 2 arguments
|
|
|
|
# (0 given)" deep inside deepcopy().
|
|
|
|
#
|
|
|
|
# Python 2.5 and 2.6 succeeded, but logged internally caught exception
|
|
|
|
# spew:
|
|
|
|
#
|
|
|
|
# Exception RuntimeError: 'maximum recursion depth exceeded while
|
|
|
|
# calling a Python object' in <type 'exceptions.AttributeError'>
|
|
|
|
# ignored"
|
|
|
|
query = Q(user=response.context['user']) & Q(someflag=True)
|
2009-10-20 22:11:08 +08:00
|
|
|
|
|
|
|
# Tests for user equality. This is hard because User defines
|
|
|
|
# equality in a non-duck-typing way
|
|
|
|
# See bug #12060
|
|
|
|
self.assertEqual(response.context['user'], user)
|
|
|
|
self.assertEqual(user, response.context['user'])
|