Fixed #4988 -- In the test client, Added tracking of the client and request that caused a response so that the assertRedirects check can use the correct client when following a redirect. Well spotted, alex@gc-web.de.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@6039 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
afc6985267
commit
3bf4ef0c77
|
@ -182,6 +182,10 @@ class Client:
|
|||
if self.exc_info:
|
||||
raise self.exc_info[1], None, self.exc_info[2]
|
||||
|
||||
# Save the client and request that stimulated the response
|
||||
response.client = self
|
||||
response.request = request
|
||||
|
||||
# Add any rendered template detail to the response
|
||||
# If there was only one template rendered (the most likely case),
|
||||
# flatten the list to a single element
|
||||
|
|
|
@ -80,7 +80,9 @@ class TestCase(unittest.TestCase):
|
|||
self.assertEqual(url, expected_url,
|
||||
"Response redirected to '%s', expected '%s'" % (url, expected_url))
|
||||
|
||||
redirect_response = self.client.get(path, QueryDict(query))
|
||||
# Get the redirection page, using the same client that was used
|
||||
# to obtain the original response.
|
||||
redirect_response = response.client.get(path, QueryDict(query))
|
||||
self.assertEqual(redirect_response.status_code, target_status_code,
|
||||
"Couldn't retrieve redirection page '%s': response code was %d (expected %d)" %
|
||||
(path, redirect_response.status_code, target_status_code))
|
||||
|
|
|
@ -577,13 +577,25 @@ Specifically, a ``Response`` object has the following attributes:
|
|||
=============== ==========================================================
|
||||
Attribute Description
|
||||
=============== ==========================================================
|
||||
``status_code`` The HTTP status of the response, as an integer. See
|
||||
RFC2616_ for a full list of HTTP status codes.
|
||||
``client`` The test client that was used to make the request that
|
||||
resulted in the response.
|
||||
|
||||
``content`` The body of the response, as a string. This is the final
|
||||
page content as rendered by the view, or any error
|
||||
message (such as the URL for a 302 redirect).
|
||||
|
||||
``context`` The template ``Context`` instance that was used to render
|
||||
the template that produced the response content.
|
||||
|
||||
If the rendered page used multiple templates, then
|
||||
``context`` will be a list of ``Context``
|
||||
objects, in the order in which they were rendered.
|
||||
|
||||
``request`` The request data that stimulated the response.
|
||||
|
||||
``status_code`` The HTTP status of the response, as an integer. See
|
||||
RFC2616_ for a full list of HTTP status codes.
|
||||
|
||||
``template`` The ``Template`` instance that was used to render the
|
||||
final content. Use ``template.name`` to get the
|
||||
template's file name, if the template was loaded from a
|
||||
|
@ -594,13 +606,6 @@ Specifically, a ``Response`` object has the following attributes:
|
|||
using `template inheritance`_ -- then ``template`` will
|
||||
be a list of ``Template`` instances, in the order in
|
||||
which they were rendered.
|
||||
|
||||
``context`` The template ``Context`` instance that was used to render
|
||||
the template that produced the response content.
|
||||
|
||||
As with ``template``, if the rendered page used multiple
|
||||
templates, then ``context`` will be a list of ``Context``
|
||||
objects, in the order in which they were rendered.
|
||||
=============== ==========================================================
|
||||
|
||||
.. _RFC2616: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
|
||||
|
@ -828,7 +833,7 @@ useful for testing Web applications:
|
|||
|
||||
``assertRedirects(response, expected_url, status_code=302, target_status_code=200)``
|
||||
Asserts that the response return a ``status_code`` redirect status,
|
||||
it redirected to ``expected_url`` (including any GET data), and the subsequent
|
||||
it redirected to ``expected_url`` (including any GET data), and the subsequent
|
||||
page was received with ``target_status_code``.
|
||||
|
||||
``assertTemplateUsed(response, template_name)``
|
||||
|
|
|
@ -234,7 +234,8 @@ class ClientTest(TestCase):
|
|||
self.assertRedirects(response, '/accounts/login/?next=/test_client/login_protected_view/')
|
||||
|
||||
# Log in
|
||||
self.client.login(username='testclient', password='password')
|
||||
login = self.client.login(username='testclient', password='password')
|
||||
self.assertTrue(login, 'Could not log in')
|
||||
|
||||
# Request a page that requires a login
|
||||
response = self.client.get('/test_client/login_protected_view/')
|
||||
|
|
|
@ -212,7 +212,7 @@ class AssertFormErrorTests(TestCase):
|
|||
except AssertionError, e:
|
||||
self.assertEqual(str(e), "The field 'email' on form 'form' in context 0 does not contain the error 'Some error.' (actual errors: [u'Enter a valid e-mail address.'])")
|
||||
|
||||
class AssertFileUploadTests(TestCase):
|
||||
class FileUploadTests(TestCase):
|
||||
def test_simple_upload(self):
|
||||
fd = open(os.path.join(os.path.dirname(__file__), "views.py"))
|
||||
post_data = {
|
||||
|
@ -221,3 +221,22 @@ class AssertFileUploadTests(TestCase):
|
|||
}
|
||||
response = self.client.post('/test_client_regress/file_upload/', post_data)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
class LoginTests(TestCase):
|
||||
fixtures = ['testdata']
|
||||
|
||||
def test_login_different_client(self):
|
||||
"Check that using a different test client doesn't violate authentication"
|
||||
|
||||
# Create a second client, and log in.
|
||||
c = Client()
|
||||
login = c.login(username='testclient', password='password')
|
||||
self.assertTrue(login, 'Could not log in')
|
||||
|
||||
# Get a redirection page with the second client.
|
||||
response = c.get("/test_client_regress/login_protected_redirect_view/")
|
||||
|
||||
# At this points, the self.client isn't logged in.
|
||||
# Check that assertRedirects uses the original client, not the
|
||||
# default client.
|
||||
self.assertRedirects(response, "/test_client_regress/get_view/")
|
||||
|
|
|
@ -4,4 +4,6 @@ import views
|
|||
urlpatterns = patterns('',
|
||||
(r'^no_template_view/$', views.no_template_view),
|
||||
(r'^file_upload/$', views.file_upload_view),
|
||||
(r'^get_view/$', views.get_view),
|
||||
(r'^login_protected_redirect_view/$', views.login_protected_redirect_view)
|
||||
)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from django.contrib.auth.decorators import login_required
|
||||
from django.core.mail import EmailMessage, SMTPConnection
|
||||
from django.http import HttpResponse, HttpResponseServerError
|
||||
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseServerError
|
||||
from django.shortcuts import render_to_response
|
||||
|
||||
def no_template_view(request):
|
||||
|
@ -18,3 +19,12 @@ def file_upload_view(request):
|
|||
else:
|
||||
return HttpResponseServerError()
|
||||
|
||||
def get_view(request):
|
||||
"A simple login protected view"
|
||||
return HttpResponse("Hello world")
|
||||
get_view = login_required(get_view)
|
||||
|
||||
def login_protected_redirect_view(request):
|
||||
"A view that redirects all requests to the GET view"
|
||||
return HttpResponseRedirect('/test_client_regress/get_view/')
|
||||
login_protected_redirect_view = login_required(login_protected_redirect_view)
|
Loading…
Reference in New Issue