test_decorators.py 4.0 KB

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