Fixed #12571 -- Attached originating WSGIRequest to test client responses.

Originating WSGIRequests are now attached to the ``wsgi_request`` attribute of
the ``HttpResponse`` returned by the testing client.

Thanks rvdrijst for the suggestion.
This commit is contained in:
Unai Zalakain 2013-11-19 09:44:30 +01:00 committed by Tim Graham
parent 9ae17d994b
commit 9eb16031ca
4 changed files with 30 additions and 7 deletions

View File

@ -83,10 +83,9 @@ def closing_iterator_wrapper(iterable, close):
class ClientHandler(BaseHandler): class ClientHandler(BaseHandler):
""" """
A HTTP Handler that can be used for testing purposes. A HTTP Handler that can be used for testing purposes. Uses the WSGI
Uses the WSGI interface to compose requests, but returns the raw interface to compose requests, but returns the raw HttpResponse object with
HttpResponse object with the originating WSGIRequest attached to its the originating WSGIRequest attached to its ``wsgi_request`` attribute.
``request_instance`` attribute.
""" """
def __init__(self, enforce_csrf_checks=True, *args, **kwargs): def __init__(self, enforce_csrf_checks=True, *args, **kwargs):
self.enforce_csrf_checks = enforce_csrf_checks self.enforce_csrf_checks = enforce_csrf_checks
@ -112,7 +111,7 @@ class ClientHandler(BaseHandler):
response = self.get_response(request) response = self.get_response(request)
# Attach the originating request to the response so that it could be # Attach the originating request to the response so that it could be
# later retrieved. # later retrieved.
response.request_instance = request response.wsgi_request = request
# We're emulating a WSGI server; we must call the close method # We're emulating a WSGI server; we must call the close method
# on completion. # on completion.
@ -555,7 +554,7 @@ class Client(RequestFactory):
engine = import_module(settings.SESSION_ENGINE) engine = import_module(settings.SESSION_ENGINE)
# Create a fake request that goes through request middleware # Create a fake request that goes through request middleware
request = self.request().request_instance request = self.request().wsgi_request
if self.session: if self.session:
request.session = self.session request.session = self.session
@ -589,7 +588,7 @@ class Client(RequestFactory):
Causes the authenticated user to be logged out. Causes the authenticated user to be logged out.
""" """
# Create a fake request that goes through request middleware # Create a fake request that goes through request middleware
request = self.request().request_instance request = self.request().wsgi_request
engine = import_module(settings.SESSION_ENGINE) engine = import_module(settings.SESSION_ENGINE)
UserModel = get_user_model() UserModel = get_user_model()

View File

@ -579,6 +579,9 @@ Tests
* :meth:`~django.test.TransactionTestCase.assertNumQueries` now prints * :meth:`~django.test.TransactionTestCase.assertNumQueries` now prints
out the list of executed queries if the assertion fails. out the list of executed queries if the assertion fails.
* The ``WSGIRequest`` instance generated by the test handler is now attached to
the :attr:`django.test.Response.wsgi_request` attribute.
Validators Validators
^^^^^^^^^^ ^^^^^^^^^^

View File

@ -427,6 +427,13 @@ Specifically, a ``Response`` object has the following attributes:
The request data that stimulated the response. The request data that stimulated the response.
.. attribute:: wsgi_request
.. versionadded:: 1.7
The ``WSGIRequest`` instance generated by the test handler that
generated the response.
.. attribute:: status_code .. attribute:: status_code
The HTTP status of the response, as an integer. See The HTTP status of the response, as an integer. See

View File

@ -84,6 +84,20 @@ class ClientTest(TestCase):
self.assertEqual(response['X-DJANGO-TEST'], 'Slartibartfast') self.assertEqual(response['X-DJANGO-TEST'], 'Slartibartfast')
def test_response_attached_request(self):
"""
Check that the returned response has a ``request`` attribute with the
originating environ dict and a ``wsgi_request`` with the originating
``WSGIRequest`` instance.
"""
response = self.client.get("/test_client/header_view/")
self.assertTrue(hasattr(response, 'request'))
self.assertTrue(hasattr(response, 'wsgi_request'))
for key, value in response.request.items():
self.assertIn(key, response.wsgi_request.environ)
self.assertEqual(response.wsgi_request.environ[key], value)
def test_raw_post(self): def test_raw_post(self):
"POST raw data (with a content type) to a view" "POST raw data (with a content type) to a view"
test_doc = """<?xml version="1.0" encoding="utf-8"?><library><book><title>Blink</title><author>Malcolm Gladwell</author></book></library>""" test_doc = """<?xml version="1.0" encoding="utf-8"?><library><book><title>Blink</title><author>Malcolm Gladwell</author></book></library>"""