tests.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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
  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", hint=None, 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", obj=None)
  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", hint=None, 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", hint=None, 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", hint=None, obj=manager)
  84. expected = "check_framework.SimpleModel.manager: Error"
  85. self.assertEqual(force_text(e), expected)
  86. def simple_system_check(**kwargs):
  87. simple_system_check.kwargs = kwargs
  88. return []
  89. def tagged_system_check(**kwargs):
  90. tagged_system_check.kwargs = kwargs
  91. return [checks.Warning('System Check')]
  92. tagged_system_check.tags = ['simpletag']
  93. def deployment_system_check(**kwargs):
  94. deployment_system_check.kwargs = kwargs
  95. return [checks.Warning('Deployment Check')]
  96. deployment_system_check.tags = ['deploymenttag']
  97. class CheckCommandTests(SimpleTestCase):
  98. def setUp(self):
  99. simple_system_check.kwargs = None
  100. tagged_system_check.kwargs = None
  101. self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
  102. sys.stdout, sys.stderr = StringIO(), StringIO()
  103. def tearDown(self):
  104. sys.stdout, sys.stderr = self.old_stdout, self.old_stderr
  105. @override_system_checks([simple_system_check, tagged_system_check])
  106. def test_simple_call(self):
  107. call_command('check')
  108. self.assertEqual(simple_system_check.kwargs, {'app_configs': None})
  109. self.assertEqual(tagged_system_check.kwargs, {'app_configs': None})
  110. @override_system_checks([simple_system_check, tagged_system_check])
  111. def test_given_app(self):
  112. call_command('check', 'auth', 'admin')
  113. auth_config = apps.get_app_config('auth')
  114. admin_config = apps.get_app_config('admin')
  115. self.assertEqual(simple_system_check.kwargs, {'app_configs': [auth_config, admin_config]})
  116. self.assertEqual(tagged_system_check.kwargs, {'app_configs': [auth_config, admin_config]})
  117. @override_system_checks([simple_system_check, tagged_system_check])
  118. def test_given_tag(self):
  119. call_command('check', tags=['simpletag'])
  120. self.assertEqual(simple_system_check.kwargs, None)
  121. self.assertEqual(tagged_system_check.kwargs, {'app_configs': None})
  122. @override_system_checks([simple_system_check, tagged_system_check])
  123. def test_invalid_tag(self):
  124. with self.assertRaises(CommandError):
  125. call_command('check', tags=['missingtag'])
  126. @override_system_checks([simple_system_check])
  127. def test_list_tags_empty(self):
  128. call_command('check', list_tags=True)
  129. self.assertEqual('\n', sys.stdout.getvalue())
  130. @override_system_checks([tagged_system_check])
  131. def test_list_tags(self):
  132. call_command('check', list_tags=True)
  133. self.assertEqual('simpletag\n', sys.stdout.getvalue())
  134. @override_system_checks([tagged_system_check], deployment_checks=[deployment_system_check])
  135. def test_list_deployment_check_omitted(self):
  136. call_command('check', list_tags=True)
  137. self.assertEqual('simpletag\n', sys.stdout.getvalue())
  138. @override_system_checks([tagged_system_check], deployment_checks=[deployment_system_check])
  139. def test_list_deployment_check_included(self):
  140. call_command('check', deploy=True, list_tags=True)
  141. self.assertEqual('deploymenttag\nsimpletag\n', sys.stdout.getvalue())
  142. @override_system_checks([tagged_system_check], deployment_checks=[deployment_system_check])
  143. def test_tags_deployment_check_omitted(self):
  144. msg = 'There is no system check with the "deploymenttag" tag.'
  145. with self.assertRaisesMessage(CommandError, msg):
  146. call_command('check', tags=['deploymenttag'])
  147. @override_system_checks([tagged_system_check], deployment_checks=[deployment_system_check])
  148. def test_tags_deployment_check_included(self):
  149. call_command('check', deploy=True, tags=['deploymenttag'])
  150. self.assertIn('Deployment Check', sys.stderr.getvalue())
  151. @override_system_checks([tagged_system_check])
  152. def test_fail_level(self):
  153. with self.assertRaises(CommandError):
  154. call_command('check', fail_level='WARNING')
  155. def custom_error_system_check(app_configs, **kwargs):
  156. return [
  157. Error(
  158. 'Error',
  159. hint=None,
  160. id='myerrorcheck.E001',
  161. )
  162. ]
  163. def custom_warning_system_check(app_configs, **kwargs):
  164. return [
  165. Warning(
  166. 'Warning',
  167. hint=None,
  168. id='mywarningcheck.E001',
  169. )
  170. ]
  171. class SilencingCheckTests(SimpleTestCase):
  172. def setUp(self):
  173. self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
  174. self.stdout, self.stderr = StringIO(), StringIO()
  175. sys.stdout, sys.stderr = self.stdout, self.stderr
  176. def tearDown(self):
  177. sys.stdout, sys.stderr = self.old_stdout, self.old_stderr
  178. @override_settings(SILENCED_SYSTEM_CHECKS=['myerrorcheck.E001'])
  179. @override_system_checks([custom_error_system_check])
  180. def test_silenced_error(self):
  181. out = StringIO()
  182. err = StringIO()
  183. try:
  184. call_command('check', stdout=out, stderr=err)
  185. except CommandError:
  186. self.fail("The mycheck.E001 check should be silenced.")
  187. self.assertEqual(out.getvalue(), 'System check identified no issues (1 silenced).\n')
  188. self.assertEqual(err.getvalue(), '')
  189. @override_settings(SILENCED_SYSTEM_CHECKS=['mywarningcheck.E001'])
  190. @override_system_checks([custom_warning_system_check])
  191. def test_silenced_warning(self):
  192. out = StringIO()
  193. err = StringIO()
  194. try:
  195. call_command('check', stdout=out, stderr=err)
  196. except CommandError:
  197. self.fail("The mycheck.E001 check should be silenced.")
  198. self.assertEqual(out.getvalue(), 'System check identified no issues (1 silenced).\n')
  199. self.assertEqual(err.getvalue(), '')
  200. class CheckFrameworkReservedNamesTests(SimpleTestCase):
  201. @isolate_apps('check_framework', kwarg_name='apps')
  202. @override_system_checks([checks.model_checks.check_all_models])
  203. def test_model_check_method_not_shadowed(self, apps):
  204. class ModelWithAttributeCalledCheck(models.Model):
  205. check = 42
  206. class ModelWithFieldCalledCheck(models.Model):
  207. check = models.IntegerField()
  208. class ModelWithRelatedManagerCalledCheck(models.Model):
  209. pass
  210. class ModelWithDescriptorCalledCheck(models.Model):
  211. check = models.ForeignKey(ModelWithRelatedManagerCalledCheck, models.CASCADE)
  212. article = models.ForeignKey(
  213. ModelWithRelatedManagerCalledCheck,
  214. models.CASCADE,
  215. related_name='check',
  216. )
  217. errors = checks.run_checks(app_configs=apps.get_app_configs())
  218. expected = [
  219. Error(
  220. "The 'ModelWithAttributeCalledCheck.check()' class method is "
  221. "currently overridden by 42.",
  222. hint=None,
  223. obj=ModelWithAttributeCalledCheck,
  224. id='models.E020'
  225. ),
  226. Error(
  227. "The 'ModelWithRelatedManagerCalledCheck.check()' class method is "
  228. "currently overridden by %r." % ModelWithRelatedManagerCalledCheck.check,
  229. hint=None,
  230. obj=ModelWithRelatedManagerCalledCheck,
  231. id='models.E020'
  232. ),
  233. Error(
  234. "The 'ModelWithDescriptorCalledCheck.check()' class method is "
  235. "currently overridden by %r." % ModelWithDescriptorCalledCheck.check,
  236. hint=None,
  237. obj=ModelWithDescriptorCalledCheck,
  238. id='models.E020'
  239. ),
  240. ]
  241. self.assertEqual(errors, expected)