/tests/regressiontests/utils/decorators.py

https://code.google.com/p/mango-py/ · Python · 106 lines · 59 code · 23 blank · 24 comment · 0 complexity · 2c50cc1ff623bb2f03c97b19b1c51c42 MD5 · raw file

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