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