test_templates.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. from copy import copy, deepcopy
  2. from django.core.checks import Error
  3. from django.core.checks.templates import (
  4. E001, E002, E003, check_for_template_tags_with_the_same_name,
  5. check_setting_app_dirs_loaders, check_string_if_invalid_is_string,
  6. )
  7. from django.test import SimpleTestCase
  8. from django.test.utils import override_settings
  9. class CheckTemplateSettingsAppDirsTest(SimpleTestCase):
  10. TEMPLATES_APP_DIRS_AND_LOADERS = [
  11. {
  12. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  13. 'APP_DIRS': True,
  14. 'OPTIONS': {
  15. 'loaders': ['django.template.loaders.filesystem.Loader'],
  16. },
  17. },
  18. ]
  19. @override_settings(TEMPLATES=TEMPLATES_APP_DIRS_AND_LOADERS)
  20. def test_app_dirs_and_loaders(self):
  21. """
  22. Error if template loaders are specified and APP_DIRS is True.
  23. """
  24. self.assertEqual(check_setting_app_dirs_loaders(None), [E001])
  25. def test_app_dirs_removed(self):
  26. TEMPLATES = deepcopy(self.TEMPLATES_APP_DIRS_AND_LOADERS)
  27. del TEMPLATES[0]['APP_DIRS']
  28. with self.settings(TEMPLATES=TEMPLATES):
  29. self.assertEqual(check_setting_app_dirs_loaders(None), [])
  30. def test_loaders_removed(self):
  31. TEMPLATES = deepcopy(self.TEMPLATES_APP_DIRS_AND_LOADERS)
  32. del TEMPLATES[0]['OPTIONS']['loaders']
  33. with self.settings(TEMPLATES=TEMPLATES):
  34. self.assertEqual(check_setting_app_dirs_loaders(None), [])
  35. class CheckTemplateStringIfInvalidTest(SimpleTestCase):
  36. TEMPLATES_STRING_IF_INVALID = [
  37. {
  38. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  39. 'OPTIONS': {
  40. 'string_if_invalid': False,
  41. },
  42. },
  43. {
  44. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  45. 'OPTIONS': {
  46. 'string_if_invalid': 42,
  47. },
  48. },
  49. ]
  50. @classmethod
  51. def setUpClass(cls):
  52. super().setUpClass()
  53. cls.error1 = copy(E002)
  54. cls.error2 = copy(E002)
  55. string_if_invalid1 = cls.TEMPLATES_STRING_IF_INVALID[0]['OPTIONS']['string_if_invalid']
  56. string_if_invalid2 = cls.TEMPLATES_STRING_IF_INVALID[1]['OPTIONS']['string_if_invalid']
  57. cls.error1.msg = cls.error1.msg.format(string_if_invalid1, type(string_if_invalid1).__name__)
  58. cls.error2.msg = cls.error2.msg.format(string_if_invalid2, type(string_if_invalid2).__name__)
  59. @override_settings(TEMPLATES=TEMPLATES_STRING_IF_INVALID)
  60. def test_string_if_invalid_not_string(self):
  61. self.assertEqual(check_string_if_invalid_is_string(None), [self.error1, self.error2])
  62. def test_string_if_invalid_first_is_string(self):
  63. TEMPLATES = deepcopy(self.TEMPLATES_STRING_IF_INVALID)
  64. TEMPLATES[0]['OPTIONS']['string_if_invalid'] = 'test'
  65. with self.settings(TEMPLATES=TEMPLATES):
  66. self.assertEqual(check_string_if_invalid_is_string(None), [self.error2])
  67. def test_string_if_invalid_both_are_strings(self):
  68. TEMPLATES = deepcopy(self.TEMPLATES_STRING_IF_INVALID)
  69. TEMPLATES[0]['OPTIONS']['string_if_invalid'] = 'test'
  70. TEMPLATES[1]['OPTIONS']['string_if_invalid'] = 'test'
  71. with self.settings(TEMPLATES=TEMPLATES):
  72. self.assertEqual(check_string_if_invalid_is_string(None), [])
  73. def test_string_if_invalid_not_specified(self):
  74. TEMPLATES = deepcopy(self.TEMPLATES_STRING_IF_INVALID)
  75. del TEMPLATES[1]['OPTIONS']['string_if_invalid']
  76. with self.settings(TEMPLATES=TEMPLATES):
  77. self.assertEqual(check_string_if_invalid_is_string(None), [self.error1])
  78. class CheckTemplateTagLibrariesWithSameName(SimpleTestCase):
  79. @classmethod
  80. def setUpClass(cls):
  81. super().setUpClass()
  82. cls.error_same_tags = Error(
  83. E003.msg.format(
  84. "'same_tags'",
  85. "'check_framework.template_test_apps.same_tags_app_1."
  86. "templatetags.same_tags', "
  87. "'check_framework.template_test_apps.same_tags_app_2."
  88. "templatetags.same_tags'",
  89. ),
  90. id=E003.id,
  91. )
  92. @staticmethod
  93. def get_settings(module_name, module_path):
  94. return {
  95. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  96. 'OPTIONS': {
  97. 'libraries': {
  98. module_name: f'check_framework.template_test_apps.{module_path}',
  99. },
  100. },
  101. }
  102. @override_settings(INSTALLED_APPS=[
  103. 'check_framework.template_test_apps.same_tags_app_1',
  104. 'check_framework.template_test_apps.same_tags_app_2',
  105. ])
  106. def test_template_tags_with_same_name(self):
  107. self.assertEqual(
  108. check_for_template_tags_with_the_same_name(None),
  109. [self.error_same_tags],
  110. )
  111. def test_template_tags_with_same_library_name(self):
  112. with self.settings(TEMPLATES=[
  113. self.get_settings('same_tags', 'same_tags_app_1.templatetags.same_tags'),
  114. self.get_settings('same_tags', 'same_tags_app_2.templatetags.same_tags'),
  115. ]):
  116. self.assertEqual(
  117. check_for_template_tags_with_the_same_name(None),
  118. [self.error_same_tags],
  119. )
  120. @override_settings(INSTALLED_APPS=[
  121. 'check_framework.template_test_apps.same_tags_app_1'
  122. ])
  123. def test_template_tags_with_same_library_name_and_module_name(self):
  124. with self.settings(TEMPLATES=[
  125. self.get_settings(
  126. 'same_tags',
  127. 'different_tags_app.templatetags.different_tags',
  128. ),
  129. ]):
  130. self.assertEqual(check_for_template_tags_with_the_same_name(None), [Error(
  131. E003.msg.format(
  132. "'same_tags'",
  133. "'check_framework.template_test_apps.different_tags_app."
  134. "templatetags.different_tags', "
  135. "'check_framework.template_test_apps.same_tags_app_1."
  136. "templatetags.same_tags'",
  137. ),
  138. id=E003.id,
  139. )])
  140. def test_template_tags_with_different_library_name(self):
  141. with self.settings(TEMPLATES=[
  142. self.get_settings('same_tags', 'same_tags_app_1.templatetags.same_tags'),
  143. self.get_settings('not_same_tags', 'same_tags_app_2.templatetags.same_tags'),
  144. ]):
  145. self.assertEqual(check_for_template_tags_with_the_same_name(None), [])
  146. @override_settings(INSTALLED_APPS=[
  147. 'check_framework.template_test_apps.same_tags_app_1',
  148. 'check_framework.template_test_apps.different_tags_app',
  149. ])
  150. def test_template_tags_with_different_name(self):
  151. self.assertEqual(check_for_template_tags_with_the_same_name(None), [])