test_templates.py 7.7 KB

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