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:
parent
9ae17d994b
commit
9eb16031ca
|
@ -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()
|
||||||
|
|
|
@ -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:
|
||||||
|
|
||||||
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):
|
||||||
|
|
||||||
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>"""
|
||||||
|
|
Loading…
Reference in New Issue