response.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import os
  2. from django.utils import unittest
  3. from django.test import RequestFactory
  4. from django.conf import settings
  5. import django.template.context
  6. from django.template import Template, Context, RequestContext
  7. from django.template.response import (TemplateResponse, SimpleTemplateResponse,
  8. ContentNotRenderedError)
  9. def test_processor(request):
  10. return {'processors': 'yes'}
  11. test_processor_name = 'regressiontests.templates.response.test_processor'
  12. class BaseTemplateResponseTest(unittest.TestCase):
  13. # tests rely on fact that global context
  14. # processors should only work when RequestContext is used.
  15. def setUp(self):
  16. self.factory = RequestFactory()
  17. self._old_processors = settings.TEMPLATE_CONTEXT_PROCESSORS
  18. self._old_TEMPLATE_DIRS = settings.TEMPLATE_DIRS
  19. settings.TEMPLATE_CONTEXT_PROCESSORS = [test_processor_name]
  20. settings.TEMPLATE_DIRS = (
  21. os.path.join(
  22. os.path.dirname(__file__),
  23. 'templates'
  24. ),
  25. )
  26. # Force re-evaluation of the contex processor list
  27. django.template.context._standard_context_processors = None
  28. def tearDown(self):
  29. settings.TEMPLATE_DIRS = self._old_TEMPLATE_DIRS
  30. settings.TEMPLATE_CONTEXT_PROCESSORS = self._old_processors
  31. # Force re-evaluation of the contex processor list
  32. django.template.context._standard_context_processors = None
  33. class SimpleTemplateResponseTest(BaseTemplateResponseTest):
  34. def _response(self, template='foo', *args, **kwargs):
  35. return SimpleTemplateResponse(Template(template), *args, **kwargs)
  36. def test_template_resolving(self):
  37. response = SimpleTemplateResponse('first/test.html')
  38. response.render()
  39. self.assertEqual('First template\n', response.content)
  40. templates = ['foo.html', 'second/test.html', 'first/test.html']
  41. response = SimpleTemplateResponse(templates)
  42. response.render()
  43. self.assertEqual('Second template\n', response.content)
  44. response = self._response()
  45. response.render()
  46. self.assertEqual(response.content, 'foo')
  47. def test_explicit_baking(self):
  48. # explicit baking
  49. response = self._response()
  50. self.assertFalse(response.is_rendered)
  51. response.render()
  52. self.assertTrue(response.is_rendered)
  53. def test_render(self):
  54. # response is not re-rendered without the render call
  55. response = self._response().render()
  56. self.assertEqual(response.content, 'foo')
  57. # rebaking doesn't change the rendered content
  58. response.template_name = Template('bar{{ baz }}')
  59. response.render()
  60. self.assertEqual(response.content, 'foo')
  61. # but rendered content can be overridden by manually
  62. # setting content
  63. response.content = 'bar'
  64. self.assertEqual(response.content, 'bar')
  65. def test_iteration_unrendered(self):
  66. # unrendered response raises an exception on iteration
  67. response = self._response()
  68. self.assertFalse(response.is_rendered)
  69. def iteration():
  70. for x in response:
  71. pass
  72. self.assertRaises(ContentNotRenderedError, iteration)
  73. self.assertFalse(response.is_rendered)
  74. def test_iteration_rendered(self):
  75. # iteration works for rendered responses
  76. response = self._response().render()
  77. res = [x for x in response]
  78. self.assertEqual(res, ['foo'])
  79. def test_content_access_unrendered(self):
  80. # unrendered response raises an exception when content is accessed
  81. response = self._response()
  82. self.assertFalse(response.is_rendered)
  83. self.assertRaises(ContentNotRenderedError, lambda: response.content)
  84. self.assertFalse(response.is_rendered)
  85. def test_content_access_rendered(self):
  86. # rendered response content can be accessed
  87. response = self._response().render()
  88. self.assertEqual(response.content, 'foo')
  89. def test_set_content(self):
  90. # content can be overriden
  91. response = self._response()
  92. self.assertFalse(response.is_rendered)
  93. response.content = 'spam'
  94. self.assertTrue(response.is_rendered)
  95. self.assertEqual(response.content, 'spam')
  96. response.content = 'baz'
  97. self.assertEqual(response.content, 'baz')
  98. def test_dict_context(self):
  99. response = self._response('{{ foo }}{{ processors }}',
  100. {'foo': 'bar'})
  101. self.assertEqual(response.context_data, {'foo': 'bar'})
  102. response.render()
  103. self.assertEqual(response.content, 'bar')
  104. def test_context_instance(self):
  105. response = self._response('{{ foo }}{{ processors }}',
  106. Context({'foo': 'bar'}))
  107. self.assertEqual(response.context_data.__class__, Context)
  108. response.render()
  109. self.assertEqual(response.content, 'bar')
  110. def test_kwargs(self):
  111. response = self._response(content_type = 'application/json', status=504)
  112. self.assertEqual(response['content-type'], 'application/json')
  113. self.assertEqual(response.status_code, 504)
  114. def test_args(self):
  115. response = SimpleTemplateResponse('', {}, 'application/json', 504)
  116. self.assertEqual(response['content-type'], 'application/json')
  117. self.assertEqual(response.status_code, 504)
  118. class TemplateResponseTest(BaseTemplateResponseTest):
  119. def _response(self, template='foo', *args, **kwargs):
  120. return TemplateResponse(self.factory.get('/'), Template(template),
  121. *args, **kwargs)
  122. def test_render(self):
  123. response = self._response('{{ foo }}{{ processors }}').render()
  124. self.assertEqual(response.content, 'yes')
  125. def test_render_with_requestcontext(self):
  126. response = self._response('{{ foo }}{{ processors }}',
  127. {'foo': 'bar'}).render()
  128. self.assertEqual(response.content, 'baryes')
  129. def test_render_with_context(self):
  130. response = self._response('{{ foo }}{{ processors }}',
  131. Context({'foo': 'bar'})).render()
  132. self.assertEqual(response.content, 'bar')
  133. def test_kwargs(self):
  134. response = self._response(content_type = 'application/json',
  135. status=504)
  136. self.assertEqual(response['content-type'], 'application/json')
  137. self.assertEqual(response.status_code, 504)
  138. def test_args(self):
  139. response = TemplateResponse(self.factory.get('/'), '', {},
  140. 'application/json', 504)
  141. self.assertEqual(response['content-type'], 'application/json')
  142. self.assertEqual(response.status_code, 504)