tests.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. import os
  2. import unittest
  3. import warnings
  4. from django.conf import settings, global_settings
  5. from django.core.exceptions import ImproperlyConfigured
  6. from django.http import HttpRequest
  7. from django.test import SimpleTestCase, TransactionTestCase, TestCase, signals
  8. from django.test.utils import override_settings
  9. from django.utils import six
  10. @override_settings(TEST='override', TEST_OUTER='outer')
  11. class FullyDecoratedTranTestCase(TransactionTestCase):
  12. available_apps = []
  13. def test_override(self):
  14. self.assertEqual(settings.TEST, 'override')
  15. self.assertEqual(settings.TEST_OUTER, 'outer')
  16. @override_settings(TEST='override2')
  17. def test_method_override(self):
  18. self.assertEqual(settings.TEST, 'override2')
  19. self.assertEqual(settings.TEST_OUTER, 'outer')
  20. def test_decorated_testcase_name(self):
  21. self.assertEqual(FullyDecoratedTranTestCase.__name__, 'FullyDecoratedTranTestCase')
  22. def test_decorated_testcase_module(self):
  23. self.assertEqual(FullyDecoratedTranTestCase.__module__, __name__)
  24. @override_settings(TEST='override')
  25. class FullyDecoratedTestCase(TestCase):
  26. def test_override(self):
  27. self.assertEqual(settings.TEST, 'override')
  28. @override_settings(TEST='override2')
  29. def test_method_override(self):
  30. self.assertEqual(settings.TEST, 'override2')
  31. class ClassDecoratedTestCaseSuper(TestCase):
  32. """
  33. Dummy class for testing max recursion error in child class call to
  34. super(). Refs #17011.
  35. """
  36. def test_max_recursion_error(self):
  37. pass
  38. @override_settings(TEST='override')
  39. class ClassDecoratedTestCase(ClassDecoratedTestCaseSuper):
  40. def test_override(self):
  41. self.assertEqual(settings.TEST, 'override')
  42. @override_settings(TEST='override2')
  43. def test_method_override(self):
  44. self.assertEqual(settings.TEST, 'override2')
  45. def test_max_recursion_error(self):
  46. """
  47. Overriding a method on a super class and then calling that method on
  48. the super class should not trigger infinite recursion. See #17011.
  49. """
  50. try:
  51. super(ClassDecoratedTestCase, self).test_max_recursion_error()
  52. except RuntimeError:
  53. self.fail()
  54. class SettingsTests(TestCase):
  55. def setUp(self):
  56. self.testvalue = None
  57. signals.setting_changed.connect(self.signal_callback)
  58. def tearDown(self):
  59. signals.setting_changed.disconnect(self.signal_callback)
  60. def signal_callback(self, sender, setting, value, **kwargs):
  61. if setting == 'TEST':
  62. self.testvalue = value
  63. def test_override(self):
  64. settings.TEST = 'test'
  65. self.assertEqual('test', settings.TEST)
  66. with self.settings(TEST='override'):
  67. self.assertEqual('override', settings.TEST)
  68. self.assertEqual('test', settings.TEST)
  69. del settings.TEST
  70. def test_override_change(self):
  71. settings.TEST = 'test'
  72. self.assertEqual('test', settings.TEST)
  73. with self.settings(TEST='override'):
  74. self.assertEqual('override', settings.TEST)
  75. settings.TEST = 'test2'
  76. self.assertEqual('test', settings.TEST)
  77. del settings.TEST
  78. def test_override_doesnt_leak(self):
  79. self.assertRaises(AttributeError, getattr, settings, 'TEST')
  80. with self.settings(TEST='override'):
  81. self.assertEqual('override', settings.TEST)
  82. settings.TEST = 'test'
  83. self.assertRaises(AttributeError, getattr, settings, 'TEST')
  84. @override_settings(TEST='override')
  85. def test_decorator(self):
  86. self.assertEqual('override', settings.TEST)
  87. def test_context_manager(self):
  88. self.assertRaises(AttributeError, getattr, settings, 'TEST')
  89. override = override_settings(TEST='override')
  90. self.assertRaises(AttributeError, getattr, settings, 'TEST')
  91. override.enable()
  92. self.assertEqual('override', settings.TEST)
  93. override.disable()
  94. self.assertRaises(AttributeError, getattr, settings, 'TEST')
  95. def test_class_decorator(self):
  96. # SimpleTestCase can be decorated by override_settings, but not ut.TestCase
  97. class SimpleTestCaseSubclass(SimpleTestCase):
  98. pass
  99. class UnittestTestCaseSubclass(unittest.TestCase):
  100. pass
  101. decorated = override_settings(TEST='override')(SimpleTestCaseSubclass)
  102. self.assertIsInstance(decorated, type)
  103. self.assertTrue(issubclass(decorated, SimpleTestCase))
  104. with six.assertRaisesRegex(self, Exception,
  105. "Only subclasses of Django SimpleTestCase*"):
  106. decorated = override_settings(TEST='override')(UnittestTestCaseSubclass)
  107. def test_signal_callback_context_manager(self):
  108. self.assertRaises(AttributeError, getattr, settings, 'TEST')
  109. with self.settings(TEST='override'):
  110. self.assertEqual(self.testvalue, 'override')
  111. self.assertEqual(self.testvalue, None)
  112. @override_settings(TEST='override')
  113. def test_signal_callback_decorator(self):
  114. self.assertEqual(self.testvalue, 'override')
  115. #
  116. # Regression tests for #10130: deleting settings.
  117. #
  118. def test_settings_delete(self):
  119. settings.TEST = 'test'
  120. self.assertEqual('test', settings.TEST)
  121. del settings.TEST
  122. self.assertRaises(AttributeError, getattr, settings, 'TEST')
  123. def test_settings_delete_wrapped(self):
  124. self.assertRaises(TypeError, delattr, settings, '_wrapped')
  125. def test_override_settings_delete(self):
  126. """
  127. Allow deletion of a setting in an overriden settings set (#18824)
  128. """
  129. previous_i18n = settings.USE_I18N
  130. with self.settings(USE_I18N=False):
  131. del settings.USE_I18N
  132. self.assertRaises(AttributeError, getattr, settings, 'USE_I18N')
  133. self.assertEqual(settings.USE_I18N, previous_i18n)
  134. def test_override_settings_nested(self):
  135. """
  136. Test that override_settings uses the actual _wrapped attribute at
  137. runtime, not when it was instantiated.
  138. """
  139. self.assertRaises(AttributeError, getattr, settings, 'TEST')
  140. self.assertRaises(AttributeError, getattr, settings, 'TEST2')
  141. inner = override_settings(TEST2='override')
  142. with override_settings(TEST='override'):
  143. self.assertEqual('override', settings.TEST)
  144. with inner:
  145. self.assertEqual('override', settings.TEST)
  146. self.assertEqual('override', settings.TEST2)
  147. # inner's __exit__ should have restored the settings of the outer
  148. # context manager, not those when the class was instantiated
  149. self.assertEqual('override', settings.TEST)
  150. self.assertRaises(AttributeError, getattr, settings, 'TEST2')
  151. self.assertRaises(AttributeError, getattr, settings, 'TEST')
  152. self.assertRaises(AttributeError, getattr, settings, 'TEST2')
  153. def test_allowed_include_roots_string(self):
  154. """
  155. ALLOWED_INCLUDE_ROOTS is not allowed to be incorrectly set to a string
  156. rather than a tuple.
  157. """
  158. self.assertRaises(ValueError, setattr, settings,
  159. 'ALLOWED_INCLUDE_ROOTS', '/var/www/ssi/')
  160. class TestComplexSettingOverride(TestCase):
  161. def setUp(self):
  162. self.old_warn_override_settings = signals.COMPLEX_OVERRIDE_SETTINGS.copy()
  163. signals.COMPLEX_OVERRIDE_SETTINGS.add('TEST_WARN')
  164. def tearDown(self):
  165. signals.COMPLEX_OVERRIDE_SETTINGS = self.old_warn_override_settings
  166. self.assertFalse('TEST_WARN' in signals.COMPLEX_OVERRIDE_SETTINGS)
  167. def test_complex_override_warning(self):
  168. """Regression test for #19031"""
  169. with warnings.catch_warnings(record=True) as w:
  170. warnings.simplefilter("always")
  171. override = override_settings(TEST_WARN='override')
  172. override.enable()
  173. self.assertEqual('override', settings.TEST_WARN)
  174. override.disable()
  175. self.assertEqual(len(w), 1)
  176. self.assertEqual('Overriding setting TEST_WARN can lead to unexpected behaviour.', str(w[-1].message))
  177. class TrailingSlashURLTests(TestCase):
  178. """
  179. Tests for the MEDIA_URL and STATIC_URL settings.
  180. They must end with a slash to ensure there's a deterministic way to build
  181. paths in templates.
  182. """
  183. settings_module = settings
  184. def setUp(self):
  185. self._original_media_url = self.settings_module.MEDIA_URL
  186. self._original_static_url = self.settings_module.STATIC_URL
  187. def tearDown(self):
  188. self.settings_module.MEDIA_URL = self._original_media_url
  189. self.settings_module.STATIC_URL = self._original_static_url
  190. def test_blank(self):
  191. """
  192. The empty string is accepted, even though it doesn't end in a slash.
  193. """
  194. self.settings_module.MEDIA_URL = ''
  195. self.assertEqual('', self.settings_module.MEDIA_URL)
  196. self.settings_module.STATIC_URL = ''
  197. self.assertEqual('', self.settings_module.STATIC_URL)
  198. def test_end_slash(self):
  199. """
  200. It works if the value ends in a slash.
  201. """
  202. self.settings_module.MEDIA_URL = '/foo/'
  203. self.assertEqual('/foo/', self.settings_module.MEDIA_URL)
  204. self.settings_module.MEDIA_URL = 'http://media.foo.com/'
  205. self.assertEqual('http://media.foo.com/',
  206. self.settings_module.MEDIA_URL)
  207. self.settings_module.STATIC_URL = '/foo/'
  208. self.assertEqual('/foo/', self.settings_module.STATIC_URL)
  209. self.settings_module.STATIC_URL = 'http://static.foo.com/'
  210. self.assertEqual('http://static.foo.com/',
  211. self.settings_module.STATIC_URL)
  212. def test_no_end_slash(self):
  213. """
  214. An ImproperlyConfigured exception is raised if the value doesn't end
  215. in a slash.
  216. """
  217. with self.assertRaises(ImproperlyConfigured):
  218. self.settings_module.MEDIA_URL = '/foo'
  219. with self.assertRaises(ImproperlyConfigured):
  220. self.settings_module.MEDIA_URL = 'http://media.foo.com'
  221. with self.assertRaises(ImproperlyConfigured):
  222. self.settings_module.STATIC_URL = '/foo'
  223. with self.assertRaises(ImproperlyConfigured):
  224. self.settings_module.STATIC_URL = 'http://static.foo.com'
  225. def test_double_slash(self):
  226. """
  227. If the value ends in more than one slash, presume they know what
  228. they're doing.
  229. """
  230. self.settings_module.MEDIA_URL = '/stupid//'
  231. self.assertEqual('/stupid//', self.settings_module.MEDIA_URL)
  232. self.settings_module.MEDIA_URL = 'http://media.foo.com/stupid//'
  233. self.assertEqual('http://media.foo.com/stupid//',
  234. self.settings_module.MEDIA_URL)
  235. self.settings_module.STATIC_URL = '/stupid//'
  236. self.assertEqual('/stupid//', self.settings_module.STATIC_URL)
  237. self.settings_module.STATIC_URL = 'http://static.foo.com/stupid//'
  238. self.assertEqual('http://static.foo.com/stupid//',
  239. self.settings_module.STATIC_URL)
  240. class SecureProxySslHeaderTest(TestCase):
  241. settings_module = settings
  242. def setUp(self):
  243. self._original_setting = self.settings_module.SECURE_PROXY_SSL_HEADER
  244. def tearDown(self):
  245. self.settings_module.SECURE_PROXY_SSL_HEADER = self._original_setting
  246. def test_none(self):
  247. self.settings_module.SECURE_PROXY_SSL_HEADER = None
  248. req = HttpRequest()
  249. self.assertEqual(req.is_secure(), False)
  250. def test_set_without_xheader(self):
  251. self.settings_module.SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
  252. req = HttpRequest()
  253. self.assertEqual(req.is_secure(), False)
  254. def test_set_with_xheader_wrong(self):
  255. self.settings_module.SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
  256. req = HttpRequest()
  257. req.META['HTTP_X_FORWARDED_PROTOCOL'] = 'wrongvalue'
  258. self.assertEqual(req.is_secure(), False)
  259. def test_set_with_xheader_right(self):
  260. self.settings_module.SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
  261. req = HttpRequest()
  262. req.META['HTTP_X_FORWARDED_PROTOCOL'] = 'https'
  263. self.assertEqual(req.is_secure(), True)