summaryrefslogtreecommitdiff
path: root/tests/middleware_exceptions
diff options
context:
space:
mode:
authorAlex Hill <alex@hill.net.au>2016-07-19 16:45:32 +0800
committerTim Graham <timograham@gmail.com>2016-07-25 13:41:50 -0400
commit44a6b4028033890d4a3832875c774db321182de6 (patch)
treeae7da1ad06d9b82b4d7b63e554097099fa9e0a69 /tests/middleware_exceptions
parentec4a6b33a9af7f7c266c92b4ffb9b0a49ee5b1eb (diff)
downloaddjango-44a6b4028033890d4a3832875c774db321182de6.tar.gz
Fixed #26915 -- Fixed regression handling responses returned from view middleware.
Diffstat (limited to 'tests/middleware_exceptions')
-rw-r--r--tests/middleware_exceptions/middleware.py9
-rw-r--r--tests/middleware_exceptions/test_legacy.py37
-rw-r--r--tests/middleware_exceptions/tests.py32
-rw-r--r--tests/middleware_exceptions/views.py4
4 files changed, 78 insertions, 4 deletions
diff --git a/tests/middleware_exceptions/middleware.py b/tests/middleware_exceptions/middleware.py
index 690660fb53..b1de76a5ce 100644
--- a/tests/middleware_exceptions/middleware.py
+++ b/tests/middleware_exceptions/middleware.py
@@ -2,6 +2,7 @@ from __future__ import unicode_literals
from django.http import Http404, HttpResponse
from django.template import engines
+from django.template.response import TemplateResponse
log = []
@@ -40,9 +41,15 @@ class ProcessViewNoneMiddleware(BaseMiddleware):
return None
+class ProcessViewTemplateResponseMiddleware(BaseMiddleware):
+ def process_view(self, request, view_func, view_args, view_kwargs):
+ template = engines['django'].from_string('Processed view {{ view }}{% for m in mw %}\n{{ m }}{% endfor %}')
+ return TemplateResponse(request, template, {'mw': [self.__class__.__name__], 'view': view_func.__name__})
+
+
class TemplateResponseMiddleware(BaseMiddleware):
def process_template_response(self, request, response):
- response.template_name = engines['django'].from_string('template-response middleware')
+ response.context_data['mw'].append(self.__class__.__name__)
return response
diff --git a/tests/middleware_exceptions/test_legacy.py b/tests/middleware_exceptions/test_legacy.py
index d59caa3882..227361c04a 100644
--- a/tests/middleware_exceptions/test_legacy.py
+++ b/tests/middleware_exceptions/test_legacy.py
@@ -56,12 +56,25 @@ class ViewMiddleware(TestMiddleware):
return HttpResponse('View Middleware')
+class TemplateResponseViewMiddleware(TestMiddleware):
+ def process_view(self, request, view_func, view_args, view_kwargs):
+ super(TemplateResponseViewMiddleware, self).process_view(request, view_func, view_args, view_kwargs)
+ template = engines['django'].from_string('TemplateResponse View Middleware')
+ return TemplateResponse(request, template)
+
+
class ResponseMiddleware(TestMiddleware):
def process_response(self, request, response):
super(ResponseMiddleware, self).process_response(request, response)
return HttpResponse('Response Middleware')
+class ContentAccessingResponseMiddleware(TestMiddleware):
+ def process_response(self, request, response):
+ super(ContentAccessingResponseMiddleware, self).process_response(request, response)
+ return HttpResponse('Content-accessing Response Middleware: %d' % len(response.content))
+
+
class TemplateResponseMiddleware(TestMiddleware):
def process_template_response(self, request, response):
super(TemplateResponseMiddleware, self).process_template_response(request, response)
@@ -512,6 +525,30 @@ class MiddlewareTests(BaseMiddlewareExceptionTest):
# Check that the right middleware methods have been invoked
self.assert_middleware_usage(middleware, True, True, True, True, False)
+ def test_templateresponse_from_process_view_rendered(self):
+ view_middleware = TemplateResponseViewMiddleware()
+ # ContentAccessingResponseMiddleware tries to access response.content
+ # in its process_response().
+ post_middleware = ContentAccessingResponseMiddleware()
+ self._add_middleware(view_middleware)
+ self._add_middleware(post_middleware)
+ self.assert_exceptions_handled('/middleware_exceptions/view/', [])
+ self.assert_middleware_usage(view_middleware, True, True, True, True, False)
+ self.assert_middleware_usage(post_middleware, True, True, True, True, False)
+
+ def test_templateresponse_from_process_view_passed_to_template_response_middleware(self):
+ """
+ TemplateResponses returned from process_view() should be passed to any
+ process_template_response().
+ """
+ view_middleware = TemplateResponseViewMiddleware()
+ resp_middleware = TemplateResponseMiddleware()
+ self._add_middleware(view_middleware)
+ self._add_middleware(resp_middleware)
+ self.assert_exceptions_handled('/middleware_exceptions/view/', [])
+ self.assert_middleware_usage(view_middleware, True, True, True, True, False)
+ self.assert_middleware_usage(resp_middleware, True, True, True, True, False)
+
class BadMiddlewareTests(BaseMiddlewareExceptionTest):
diff --git a/tests/middleware_exceptions/tests.py b/tests/middleware_exceptions/tests.py
index f6a7e24e59..230d062c88 100644
--- a/tests/middleware_exceptions/tests.py
+++ b/tests/middleware_exceptions/tests.py
@@ -22,10 +22,40 @@ class MiddlewareTests(SimpleTestCase):
response = self.client.get('/middleware_exceptions/view/')
self.assertEqual(response.content, b'Processed view normal_view')
+ @override_settings(MIDDLEWARE=[
+ 'middleware_exceptions.middleware.ProcessViewTemplateResponseMiddleware',
+ 'middleware_exceptions.middleware.LogMiddleware',
+ ])
+ def test_templateresponse_from_process_view_rendered(self):
+ """
+ TemplateResponses returned from process_view() must be rendered before
+ being passed to any middleware that tries to access response.content,
+ such as middleware_exceptions.middleware.LogMiddleware.
+ """
+ response = self.client.get('/middleware_exceptions/view/')
+ self.assertEqual(response.content, b'Processed view normal_view\nProcessViewTemplateResponseMiddleware')
+
+ @override_settings(MIDDLEWARE=[
+ 'middleware_exceptions.middleware.ProcessViewTemplateResponseMiddleware',
+ 'middleware_exceptions.middleware.TemplateResponseMiddleware',
+ ])
+ def test_templateresponse_from_process_view_passed_to_process_template_response(self):
+ """
+ TemplateResponses returned from process_view() should be passed to any
+ template response middleware.
+ """
+ response = self.client.get('/middleware_exceptions/view/')
+ expected_lines = [
+ b'Processed view normal_view',
+ b'ProcessViewTemplateResponseMiddleware',
+ b'TemplateResponseMiddleware',
+ ]
+ self.assertEqual(response.content, b'\n'.join(expected_lines))
+
@override_settings(MIDDLEWARE=['middleware_exceptions.middleware.TemplateResponseMiddleware'])
def test_process_template_response(self):
response = self.client.get('/middleware_exceptions/template_response/')
- self.assertEqual(response.content, b'template-response middleware')
+ self.assertEqual(response.content, b'template_response OK\nTemplateResponseMiddleware')
@override_settings(MIDDLEWARE=['middleware_exceptions.middleware.LogMiddleware'])
def test_view_exception_converted_before_middleware(self):
diff --git a/tests/middleware_exceptions/views.py b/tests/middleware_exceptions/views.py
index 891c196728..f006147daf 100644
--- a/tests/middleware_exceptions/views.py
+++ b/tests/middleware_exceptions/views.py
@@ -9,8 +9,8 @@ def normal_view(request):
def template_response(request):
- template = engines['django'].from_string('OK')
- return TemplateResponse(request, template)
+ template = engines['django'].from_string('template_response OK{% for m in mw %}\n{{ m }}{% endfor %}')
+ return TemplateResponse(request, template, context={'mw': []})
def template_response_error(request):