2
0

test_decorators.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from django.http import HttpResponse
  2. from django.template import engines
  3. from django.template.response import TemplateResponse
  4. from django.test import TestCase, RequestFactory
  5. from django.utils.decorators import decorator_from_middleware
  6. class ProcessViewMiddleware(object):
  7. def process_view(self, request, view_func, view_args, view_kwargs):
  8. pass
  9. process_view_dec = decorator_from_middleware(ProcessViewMiddleware)
  10. @process_view_dec
  11. def process_view(request):
  12. return HttpResponse()
  13. class ClassProcessView(object):
  14. def __call__(self, request):
  15. return HttpResponse()
  16. class_process_view = process_view_dec(ClassProcessView())
  17. class FullMiddleware(object):
  18. def process_request(self, request):
  19. request.process_request_reached = True
  20. def process_view(sef, request, view_func, view_args, view_kwargs):
  21. request.process_view_reached = True
  22. def process_template_response(self, request, response):
  23. request.process_template_response_reached = True
  24. return response
  25. def process_response(self, request, response):
  26. # This should never receive unrendered content.
  27. request.process_response_content = response.content
  28. request.process_response_reached = True
  29. return response
  30. full_dec = decorator_from_middleware(FullMiddleware)
  31. class DecoratorFromMiddlewareTests(TestCase):
  32. """
  33. Tests for view decorators created using
  34. ``django.utils.decorators.decorator_from_middleware``.
  35. """
  36. rf = RequestFactory()
  37. def test_process_view_middleware(self):
  38. """
  39. Test a middleware that implements process_view.
  40. """
  41. process_view(self.rf.get('/'))
  42. def test_callable_process_view_middleware(self):
  43. """
  44. Test a middleware that implements process_view, operating on a callable class.
  45. """
  46. class_process_view(self.rf.get('/'))
  47. def test_full_dec_normal(self):
  48. """
  49. Test that all methods of middleware are called for normal HttpResponses
  50. """
  51. @full_dec
  52. def normal_view(request):
  53. template = engines['django'].from_string("Hello world")
  54. return HttpResponse(template.render())
  55. request = self.rf.get('/')
  56. normal_view(request)
  57. self.assertTrue(getattr(request, 'process_request_reached', False))
  58. self.assertTrue(getattr(request, 'process_view_reached', False))
  59. # process_template_response must not be called for HttpResponse
  60. self.assertFalse(getattr(request, 'process_template_response_reached', False))
  61. self.assertTrue(getattr(request, 'process_response_reached', False))
  62. def test_full_dec_templateresponse(self):
  63. """
  64. Test that all methods of middleware are called for TemplateResponses in
  65. the right sequence.
  66. """
  67. @full_dec
  68. def template_response_view(request):
  69. template = engines['django'].from_string("Hello world")
  70. return TemplateResponse(request, template)
  71. request = self.rf.get('/')
  72. response = template_response_view(request)
  73. self.assertTrue(getattr(request, 'process_request_reached', False))
  74. self.assertTrue(getattr(request, 'process_view_reached', False))
  75. self.assertTrue(getattr(request, 'process_template_response_reached', False))
  76. # response must not be rendered yet.
  77. self.assertFalse(response._is_rendered)
  78. # process_response must not be called until after response is rendered,
  79. # otherwise some decorators like csrf_protect and gzip_page will not
  80. # work correctly. See #16004
  81. self.assertFalse(getattr(request, 'process_response_reached', False))
  82. response.render()
  83. self.assertTrue(getattr(request, 'process_response_reached', False))
  84. # Check that process_response saw the rendered content
  85. self.assertEqual(request.process_response_content, b"Hello world")