Kaydet (Commit) 9eb16031 authored tarafından Unai Zalakain's avatar Unai Zalakain Kaydeden (comit) Tim Graham

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.
üst 9ae17d99
...@@ -83,10 +83,9 @@ def closing_iterator_wrapper(iterable, close): ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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()
......
...@@ -579,6 +579,9 @@ Tests ...@@ -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
^^^^^^^^^^ ^^^^^^^^^^
......
...@@ -427,6 +427,13 @@ Specifically, a ``Response`` object has the following attributes: ...@@ -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
......
...@@ -84,6 +84,20 @@ class ClientTest(TestCase): ...@@ -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>"""
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment