tests.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import sys
  4. from django.apps import apps
  5. from django.core import checks
  6. from django.core.checks import Error, Warning
  7. from django.core.checks.registry import CheckRegistry
  8. from django.core.management import call_command
  9. from django.core.management.base import CommandError
  10. from django.db import models
  11. from django.test import SimpleTestCase
  12. from django.test.utils import (
  13. isolate_apps, override_settings, override_system_checks,
  14. )
  15. from django.utils.encoding import force_text
  16. from django.utils.six import StringIO
  17. from .models import SimpleModel, my_check
  18. class DummyObj(object):
  19. def __repr__(self):
  20. return "obj"
  21. class SystemCheckFrameworkTests(SimpleTestCase):
  22. def test_register_and_run_checks(self):
  23. def f(**kwargs):
  24. calls[0] += 1
  25. return [1, 2, 3]
  26. def f2(**kwargs):
  27. return [4, ]
  28. def f3(**kwargs):
  29. return [5, ]
  30. calls = [0]
  31. # test register as decorator
  32. registry = CheckRegistry()
  33. registry.register()(f)
  34. registry.register("tag1", "tag2")(f2)
  35. registry.register("tag2", deploy=True)(f3)
  36. # test register as function
  37. registry2 = CheckRegistry()
  38. registry2.register(f)
  39. registry2.register(f2, "tag1", "tag2")
  40. registry2.register(f3, "tag2", deploy=True)
  41. # check results
  42. errors = registry.run_checks()
  43. errors2 = registry2.run_checks()
  44. self.assertEqual(errors, errors2)
  45. self.assertEqual(sorted(errors), [1, 2, 3, 4])
  46. self.assertEqual(calls[0], 2)
  47. errors = registry.run_checks(tags=["tag1"])
  48. errors2 = registry2.run_checks(tags=["tag1"])
  49. self.assertEqual(errors, errors2)
  50. self.assertEqual(sorted(errors), [4])
  51. errors = registry.run_checks(tags=["tag1", "tag2"], include_deployment_checks=True)
  52. errors2 = registry2.run_checks(tags=["tag1", "tag2"], include_deployment_checks=True)
  53. self.assertEqual(errors, errors2)
  54. self.assertEqual(sorted(errors), [4, 5])
  55. class MessageTests(SimpleTestCase):
  56. def test_printing(self):
  57. e = Error("Message", hint="Hint", obj=DummyObj())
  58. expected = "obj: Message\n\tHINT: Hint"
  59. self.assertEqual(force_text(e), expected)
  60. def test_printing_no_hint(self):
  61. e = Error("Message", obj=DummyObj())
  62. expected = "obj: Message"
  63. self.assertEqual(force_text(e), expected)
  64. def test_printing_no_object(self):
  65. e = Error("Message", hint="Hint")
  66. expected = "?: Message\n\tHINT: Hint"
  67. self.assertEqual(force_text(e), expected)
  68. def test_printing_with_given_id(self):
  69. e = Error("Message", hint="Hint", obj=DummyObj(), id="ID")
  70. expected = "obj: (ID) Message\n\tHINT: Hint"
  71. self.assertEqual(force_text(e), expected)
  72. def test_printing_field_error(self):
  73. field = SimpleModel._meta.get_field('field')
  74. e = Error("Error", obj=field)
  75. expected = "check_framework.SimpleModel.field: Error"
  76. self.assertEqual(force_text(e), expected)
  77. def test_printing_model_error(self):
  78. e = Error("Error", obj=SimpleModel)
  79. expected = "check_framework.SimpleModel: Error"
  80. self.assertEqual(force_text(e), expected)
  81. def test_printing_manager_error(self):
  82. manager = SimpleModel.manager
  83. e = Error("Error", obj=manager)
  84. expected = "check_framework.SimpleModel.manager: Error"
  85. self.assertEqual(force_text(e), expected)
  86. def test_equal_to_self(self):
  87. e = Error("Error", obj=SimpleModel)
  88. self.assertEqual(e, e)
  89. def test_equal_to_same_constructed_check(self):
  90. e1 = Error("Error", obj=SimpleModel)
  91. e2 = Error("Error", obj=SimpleModel)
  92. self.assertEqual(e1, e2)
  93. def test_not_equal_to_different_constructed_check(self):
  94. e1 = Error("Error", obj=SimpleModel)
  95. e2 = Error("Error2", obj=SimpleModel)
  96. self.assertNotEqual(e1, e2)
  97. def test_not_equal_to_non_check(self):
  98. e = Error("Error", obj=DummyObj())
  99. self.assertNotEqual(e, 'a string')
  100. def simple_system_check(**kwargs):
  101. simple_system_check.kwargs = kwargs
  102. return []
  103. def tagged_system_check(**kwargs):
  104. tagged_system_check.kwargs = kwargs
  105. return [checks.Warning('System Check')]
  106. tagged_system_check.tags = ['simpletag']
  107. def deployment_system_check(**kwargs):
  108. deployment_system_check.kwargs = kwargs
  109. return [checks.Warning('Deployment Check')]
  110. deployment_system_check.tags = ['deploymenttag']
  111. class CheckCommandTests(SimpleTestCase):
  112. def setUp(self):
  113. simple_system_check.kwargs = None
  114. tagged_system_check.kwargs = None
  115. self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
  116. sys.stdout, sys.stderr = StringIO(), StringIO()
  117. def tearDown(self):
  118. sys.stdout, sys.stderr = self.old_stdout, self.old_stderr
  119. @override_system_checks([simple_system_check, tagged_system_check])
  120. def test_simple_call(self):
  121. call_command('check')
  122. self.assertEqual(simple_system_check.kwargs, {'app_configs': None})
  123. self.assertEqual(tagged_system_check.kwargs, {'app_configs': None})
  124. @override_system_checks([simple_system_check, tagged_system_check])
  125. def test_given_app(self):
  126. call_command('check', 'auth', 'admin')
  127. auth_config = apps.get_app_config('auth')
  128. admin_config = apps.get_app_config('admin')
  129. self.assertEqual(simple_system_check.kwargs, {'app_configs': [auth_config, admin_config]})
  130. self.assertEqual(tagged_system_check.kwargs, {'app_configs': [auth_config, admin_config]})
  131. @override_system_checks([simple_system_check, tagged_system_check])
  132. def test_given_tag(self):
  133. call_command('check', tags=['simpletag'])
  134. self.assertIsNone(simple_system_check.kwargs)
  135. self.assertEqual(tagged_system_check.kwargs, {'app_configs': None})
  136. @override_system_checks([simple_system_check, tagged_system_check])
  137. def test_invalid_tag(self):
  138. with self.assertRaises(CommandError):
  139. call_command('check', tags=['missingtag'])
  140. @override_system_checks([simple_system_check])
  141. def test_list_tags_empty(self):
  142. call_command('check', list_tags=True)
  143. self.assertEqual('\n', sys.stdout.getvalue())
  144. @override_system_checks([tagged_system_check])
  145. def test_list_tags(self):
  146. call_command('check', list_tags=True)
  147. self.assertEqual('simpletag\n', sys.stdout.getvalue())
  148. @override_system_checks([tagged_system_check], deployment_checks=[deployment_system_check])
  149. def test_list_deployment_check_omitted(self):
  150. call_command('check', list_tags=True)
  151. self.assertEqual('simpletag\n', sys.stdout.getvalue())
  152. @override_system_checks([tagged_system_check], deployment_checks=[deployment_system_check])
  153. def test_list_deployment_check_included(self):
  154. call_command('check', deploy=True, list_tags=True)
  155. self.assertEqual('deploymenttag\nsimpletag\n', sys.stdout.getvalue())
  156. @override_system_checks([tagged_system_check], deployment_checks=[deployment_system_check])
  157. def test_tags_deployment_check_omitted(self):
  158. msg = 'There is no system check with the "deploymenttag" tag.'
  159. with self.assertRaisesMessage(CommandError, msg):
  160. call_command('check', tags=['deploymenttag'])
  161. @override_system_checks([tagged_system_check], deployment_checks=[deployment_system_check])
  162. def test_tags_deployment_check_included(self):
  163. call_command('check', deploy=True, tags=['deploymenttag'])
  164. self.assertIn('Deployment Check', sys.stderr.getvalue())
  165. @override_system_checks([tagged_system_check])
  166. def test_fail_level(self):
  167. with self.assertRaises(CommandError):
  168. call_command('check', fail_level='WARNING')
  169. def custom_error_system_check(app_configs, **kwargs):
  170. return [Error('Error', id='myerrorcheck.E001')]
  171. def custom_warning_system_check(app_configs, **kwargs):
  172. return [Warning('Warning', id='mywarningcheck.E001')]
  173. class SilencingCheckTests(SimpleTestCase):
  174. def setUp(self):
  175. self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
  176. self.stdout, self.stderr = StringIO(), StringIO()
  177. sys.stdout, sys.stderr = self.stdout, self.stderr
  178. def tearDown(self):
  179. sys.stdout, sys.stderr = self.old_stdout, self.old_stderr
  180. @override_settings(SILENCED_SYSTEM_CHECKS=['myerrorcheck.E001'])
  181. @override_system_checks([custom_error_system_check])
  182. def test_silenced_error(self):
  183. out = StringIO()
  184. err = StringIO()
  185. call_command('check', stdout=out, stderr=err)
  186. self.assertEqual(out.getvalue(), 'System check identified no issues (1 silenced).\n')
  187. self.assertEqual(err.getvalue(), '')
  188. @override_settings(SILENCED_SYSTEM_CHECKS=['mywarningcheck.E001'])
  189. @override_system_checks([custom_warning_system_check])
  190. def test_silenced_warning(self):
  191. out = StringIO()
  192. err = StringIO()
  193. call_command('check', stdout=out, stderr=err)
  194. self.assertEqual(out.getvalue(), 'System check identified no issues (1 silenced).\n')
  195. self.assertEqual(err.getvalue(), '')
  196. class CheckFrameworkReservedNamesTests(SimpleTestCase):
  197. @isolate_apps('check_framework', kwarg_name='apps')
  198. @override_system_checks([checks.model_checks.check_all_models])
  199. def test_model_check_method_not_shadowed(self, apps):
  200. class ModelWithAttributeCalledCheck(models.Model):
  201. check = 42
  202. class ModelWithFieldCalledCheck(models.Model):
  203. check = models.IntegerField()
  204. class ModelWithRelatedManagerCalledCheck(models.Model):
  205. pass
  206. class ModelWithDescriptorCalledCheck(models.Model):
  207. check = models.ForeignKey(ModelWithRelatedManagerCalledCheck, models.CASCADE)
  208. article = models.ForeignKey(
  209. ModelWithRelatedManagerCalledCheck,
  210. models.CASCADE,
  211. related_name='check',
  212. )
  213. errors = checks.run_checks(app_configs=apps.get_app_configs())
  214. expected = [
  215. Error(
  216. "The 'ModelWithAttributeCalledCheck.check()' class method is "
  217. "currently overridden by 42.",
  218. obj=ModelWithAttributeCalledCheck,
  219. id='models.E020'
  220. ),
  221. Error(
  222. "The 'ModelWithRelatedManagerCalledCheck.check()' class method is "
  223. "currently overridden by %r." % ModelWithRelatedManagerCalledCheck.check,
  224. obj=ModelWithRelatedManagerCalledCheck,
  225. id='models.E020'
  226. ),
  227. Error(
  228. "The 'ModelWithDescriptorCalledCheck.check()' class method is "
  229. "currently overridden by %r." % ModelWithDescriptorCalledCheck.check,
  230. obj=ModelWithDescriptorCalledCheck,
  231. id='models.E020'
  232. ),
  233. ]
  234. self.assertEqual(errors, expected)
  235. class ChecksRunDuringTests(SimpleTestCase):
  236. def test_registered_check_did_run(self):
  237. self.assertTrue(my_check.did_run)