tests.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.utils.six import StringIO
  4. import sys
  5. from django.apps import apps
  6. from django.conf import settings
  7. from django.core import checks
  8. from django.core.checks import Error, Warning
  9. from django.core.checks.registry import CheckRegistry
  10. from django.core.checks.compatibility.django_1_6_0 import check_1_6_compatibility
  11. from django.core.management.base import CommandError
  12. from django.core.management import call_command
  13. from django.db.models.fields import NOT_PROVIDED
  14. from django.test import TestCase
  15. from django.test.utils import override_settings, override_system_checks
  16. from django.utils.encoding import force_text
  17. from .models import SimpleModel, Book
  18. class DummyObj(object):
  19. def __repr__(self):
  20. return "obj"
  21. class SystemCheckFrameworkTests(TestCase):
  22. def test_register_and_run_checks(self):
  23. calls = [0]
  24. registry = CheckRegistry()
  25. @registry.register()
  26. def f(**kwargs):
  27. calls[0] += 1
  28. return [1, 2, 3]
  29. errors = registry.run_checks()
  30. self.assertEqual(errors, [1, 2, 3])
  31. self.assertEqual(calls[0], 1)
  32. class MessageTests(TestCase):
  33. def test_printing(self):
  34. e = Error("Message", hint="Hint", obj=DummyObj())
  35. expected = "obj: Message\n\tHINT: Hint"
  36. self.assertEqual(force_text(e), expected)
  37. def test_printing_no_hint(self):
  38. e = Error("Message", hint=None, obj=DummyObj())
  39. expected = "obj: Message"
  40. self.assertEqual(force_text(e), expected)
  41. def test_printing_no_object(self):
  42. e = Error("Message", hint="Hint", obj=None)
  43. expected = "?: Message\n\tHINT: Hint"
  44. self.assertEqual(force_text(e), expected)
  45. def test_printing_with_given_id(self):
  46. e = Error("Message", hint="Hint", obj=DummyObj(), id="ID")
  47. expected = "obj: (ID) Message\n\tHINT: Hint"
  48. self.assertEqual(force_text(e), expected)
  49. def test_printing_field_error(self):
  50. field = SimpleModel._meta.get_field('field')
  51. e = Error("Error", hint=None, obj=field)
  52. expected = "check_framework.SimpleModel.field: Error"
  53. self.assertEqual(force_text(e), expected)
  54. def test_printing_model_error(self):
  55. e = Error("Error", hint=None, obj=SimpleModel)
  56. expected = "check_framework.SimpleModel: Error"
  57. self.assertEqual(force_text(e), expected)
  58. def test_printing_manager_error(self):
  59. manager = SimpleModel.manager
  60. e = Error("Error", hint=None, obj=manager)
  61. expected = "check_framework.SimpleModel.manager: Error"
  62. self.assertEqual(force_text(e), expected)
  63. class Django_1_6_0_CompatibilityChecks(TestCase):
  64. @override_settings(TEST_RUNNER='django.test.runner.DiscoverRunner')
  65. def test_test_runner_new_default(self):
  66. errors = check_1_6_compatibility()
  67. self.assertEqual(errors, [])
  68. @override_settings(TEST_RUNNER='myapp.test.CustomRunner')
  69. def test_test_runner_overriden(self):
  70. errors = check_1_6_compatibility()
  71. self.assertEqual(errors, [])
  72. def test_test_runner_not_set_explicitly(self):
  73. # If TEST_RUNNER was set explicitly, temporarily pretend it wasn't
  74. test_runner_overridden = False
  75. if 'TEST_RUNNER' in settings._wrapped._explicit_settings:
  76. test_runner_overridden = True
  77. settings._wrapped._explicit_settings.remove('TEST_RUNNER')
  78. # We remove some settings to make this look like a project generated under Django 1.5.
  79. settings._wrapped._explicit_settings.add('MANAGERS')
  80. settings._wrapped._explicit_settings.add('ADMINS')
  81. try:
  82. errors = check_1_6_compatibility()
  83. expected = [
  84. checks.Warning(
  85. "Some project unittests may not execute as expected.",
  86. hint=("Django 1.6 introduced a new default test runner. It looks like "
  87. "this project was generated using Django 1.5 or earlier. You should "
  88. "ensure your tests are all running & behaving as expected. See "
  89. "https://docs.djangoproject.com/en/dev/releases/1.6/#new-test-runner "
  90. "for more information."),
  91. obj=None,
  92. id='1_6.W001',
  93. )
  94. ]
  95. self.assertEqual(errors, expected)
  96. finally:
  97. # Restore settings value
  98. if test_runner_overridden:
  99. settings._wrapped._explicit_settings.add('TEST_RUNNER')
  100. settings._wrapped._explicit_settings.remove('MANAGERS')
  101. settings._wrapped._explicit_settings.remove('ADMINS')
  102. def test_boolean_field_default_value(self):
  103. with self.settings(TEST_RUNNER='myapp.test.CustomRunnner'):
  104. # We patch the field's default value to trigger the warning
  105. boolean_field = Book._meta.get_field('is_published')
  106. old_default = boolean_field.default
  107. try:
  108. boolean_field.default = NOT_PROVIDED
  109. errors = check_1_6_compatibility()
  110. expected = [
  111. checks.Warning(
  112. 'BooleanField does not have a default value.',
  113. hint=('Django 1.6 changed the default value of BooleanField from False to None. '
  114. 'See https://docs.djangoproject.com/en/1.6/ref/models/fields/#booleanfield '
  115. 'for more information.'),
  116. obj=boolean_field,
  117. id='1_6.W002',
  118. )
  119. ]
  120. self.assertEqual(errors, expected)
  121. finally:
  122. # Restore the ``default``
  123. boolean_field.default = old_default
  124. def simple_system_check(**kwargs):
  125. simple_system_check.kwargs = kwargs
  126. return []
  127. def tagged_system_check(**kwargs):
  128. tagged_system_check.kwargs = kwargs
  129. return []
  130. tagged_system_check.tags = ['simpletag']
  131. class CheckCommandTests(TestCase):
  132. def setUp(self):
  133. simple_system_check.kwargs = None
  134. tagged_system_check.kwargs = None
  135. self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
  136. sys.stdout, sys.stderr = StringIO(), StringIO()
  137. def tearDown(self):
  138. sys.stdout, sys.stderr = self.old_stdout, self.old_stderr
  139. @override_system_checks([simple_system_check, tagged_system_check])
  140. def test_simple_call(self):
  141. call_command('check')
  142. self.assertEqual(simple_system_check.kwargs, {'app_configs': None})
  143. self.assertEqual(tagged_system_check.kwargs, {'app_configs': None})
  144. @override_system_checks([simple_system_check, tagged_system_check])
  145. def test_given_app(self):
  146. call_command('check', 'auth', 'admin')
  147. auth_config = apps.get_app_config('auth')
  148. admin_config = apps.get_app_config('admin')
  149. self.assertEqual(simple_system_check.kwargs, {'app_configs': [auth_config, admin_config]})
  150. self.assertEqual(tagged_system_check.kwargs, {'app_configs': [auth_config, admin_config]})
  151. @override_system_checks([simple_system_check, tagged_system_check])
  152. def test_given_tag(self):
  153. call_command('check', tags=['simpletag'])
  154. self.assertEqual(simple_system_check.kwargs, None)
  155. self.assertEqual(tagged_system_check.kwargs, {'app_configs': None})
  156. @override_system_checks([simple_system_check, tagged_system_check])
  157. def test_invalid_tag(self):
  158. self.assertRaises(CommandError, call_command, 'check', tags=['missingtag'])
  159. @override_system_checks([simple_system_check])
  160. def test_list_tags_empty(self):
  161. call_command('check', list_tags=True)
  162. self.assertEqual('\n', sys.stdout.getvalue())
  163. @override_system_checks([tagged_system_check])
  164. def test_list_tags(self):
  165. call_command('check', list_tags=True)
  166. self.assertEqual('simpletag\n', sys.stdout.getvalue())
  167. def custom_error_system_check(app_configs, **kwargs):
  168. return [
  169. Error(
  170. 'Error',
  171. hint=None,
  172. id='myerrorcheck.E001',
  173. )
  174. ]
  175. def custom_warning_system_check(app_configs, **kwargs):
  176. return [
  177. Warning(
  178. 'Warning',
  179. hint=None,
  180. id='mywarningcheck.E001',
  181. )
  182. ]
  183. class SilencingCheckTests(TestCase):
  184. def setUp(self):
  185. self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
  186. self.stdout, self.stderr = StringIO(), StringIO()
  187. sys.stdout, sys.stderr = self.stdout, self.stderr
  188. def tearDown(self):
  189. sys.stdout, sys.stderr = self.old_stdout, self.old_stderr
  190. @override_settings(SILENCED_SYSTEM_CHECKS=['myerrorcheck.E001'])
  191. @override_system_checks([custom_error_system_check])
  192. def test_silenced_error(self):
  193. out = StringIO()
  194. err = StringIO()
  195. try:
  196. call_command('check', stdout=out, stderr=err)
  197. except CommandError:
  198. self.fail("The mycheck.E001 check should be silenced.")
  199. self.assertEqual(out.getvalue(), '')
  200. self.assertEqual(
  201. err.getvalue(),
  202. 'System check identified some issues:\n\n'
  203. 'ERRORS:\n'
  204. '?: (myerrorcheck.E001) Error\n\n'
  205. 'System check identified 1 issue (0 silenced).\n'
  206. )
  207. @override_settings(SILENCED_SYSTEM_CHECKS=['mywarningcheck.E001'])
  208. @override_system_checks([custom_warning_system_check])
  209. def test_silenced_warning(self):
  210. out = StringIO()
  211. err = StringIO()
  212. try:
  213. call_command('check', stdout=out, stderr=err)
  214. except CommandError:
  215. self.fail("The mycheck.E001 check should be silenced.")
  216. self.assertEqual(out.getvalue(), 'System check identified no issues (1 silenced).\n')
  217. self.assertEqual(err.getvalue(), '')