dynamicweb/cms/tests/test_templates.py

142 lines
5.9 KiB
Python

import os.path
from importlib.machinery import SourceFileLoader
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.template import TemplateDoesNotExist, loader
from django.test.utils import override_settings
from django.utils.encoding import force_str
from django.utils.translation import gettext_lazy as _
from cms import constants
from cms.test_utils.testcases import CMSTestCase
from cms.utils.conf import get_cms_setting
PATH_PREFIX = os.path.join("inner_dir", "custom_templates")
GOOD_PATH = os.path.join(settings.PROJECT_PATH, "project", "templates", PATH_PREFIX)
BAD_PATH = os.path.join(settings.PROJECT_PATH, "project", "custom_templates")
SITE_PATH = {
1: os.path.join(settings.PROJECT_PATH, "project", "templates", PATH_PREFIX),
2: os.path.join(settings.PROJECT_PATH, "project", "templates", "%s_2" % PATH_PREFIX),
}
class TemplatesConfig(CMSTestCase):
def test_templates(self):
"""
Tests that the plain CMS_TEMPLATES works as usual
"""
original_files = [template[0] for template in settings.CMS_TEMPLATES]
files = [template[0] for template in get_cms_setting("TEMPLATES")]
if get_cms_setting("TEMPLATE_INHERITANCE"):
original_files.append(constants.TEMPLATE_INHERITANCE_MAGIC)
self.assertEqual(len(files), 6)
self.assertEqual(set(files), set(original_files))
@override_settings(CMS_TEMPLATES_DIR=GOOD_PATH)
def test_custom_templates(self):
"""
Test that using CMS_TEMPLATES_DIR both template list and template labels are extracted from the new directory
"""
config_path = os.path.join(settings.CMS_TEMPLATES_DIR, "__init__.py")
mod = None
try:
mod = SourceFileLoader("mod", config_path).load_module()
except FileNotFoundError:
print(f"file not found at {config_path}")
except Exception as e:
print(f"An error occurred: {e}")
if mod:
original_labels = [force_str(_(template[1])) for template in mod.TEMPLATES.items()]
original_files = [os.path.join(PATH_PREFIX, template[0].strip()) for template in mod.TEMPLATES.items()]
templates = get_cms_setting("TEMPLATES")
self.assertEqual(len(templates), 3)
labels = [force_str(template[1]) for template in templates]
files = [template[0] for template in templates]
if get_cms_setting("TEMPLATE_INHERITANCE"):
original_labels.append(force_str(_("Inherit the template of the nearest ancestor")))
original_files.append(constants.TEMPLATE_INHERITANCE_MAGIC)
self.assertEqual(set(labels), set(original_labels))
self.assertEqual(set(files), set(original_files))
@override_settings(CMS_TEMPLATES_DIR=GOOD_PATH)
def test_custom_templates_loading(self):
"""
Checking that templates can be loaded by the template loader
"""
templates = get_cms_setting("TEMPLATES")
for template in templates:
if template[0] != constants.TEMPLATE_INHERITANCE_MAGIC:
tpl = loader.get_template(template[0])
self.assertEqual(tpl.template.name, template[0])
@override_settings(CMS_TEMPLATES_DIR=SITE_PATH)
def test_multisite(self):
"""
Checking that templates can be loaded by the template loader
"""
templates = get_cms_setting("TEMPLATES")
for template in templates:
if template[0] != constants.TEMPLATE_INHERITANCE_MAGIC:
self.assertTrue(template[0].find("%s/" % SITE_PATH[1]) >= -1)
with self.settings(SITE_ID=2):
templates = get_cms_setting("TEMPLATES")
for template in templates:
if template[0] != constants.TEMPLATE_INHERITANCE_MAGIC:
self.assertTrue(template[0].find("%s/" % SITE_PATH[2]) >= -1)
@override_settings(CMS_TEMPLATES_DIR=BAD_PATH)
def test_custom_templates_bad_dir(self):
"""
Checking that templates can be loaded by the template loader
"""
templates = get_cms_setting("TEMPLATES")
for template in templates:
if template[0] != constants.TEMPLATE_INHERITANCE_MAGIC:
with self.assertRaises(TemplateDoesNotExist):
loader.get_template(template[0])
def test_accepts_custom_django_template_backend(self):
"""
Test that django CMS accepts template engines that inherit from DjangoTemplates
"""
custom_templates_settings = [
{
"BACKEND": "cms.test_utils.project.template_backends.CustomDjangoTemplates",
"DIRS": [],
"OPTIONS": {
"context_processors": ["django.template.context_processors.request"],
},
}
]
with override_settings(TEMPLATES=custom_templates_settings):
from cms.utils.setup import validate_settings
validate_settings()
def test_rejects_non_django_template_backend(self):
"""
Test that django CMS rejects template engines that don't inherit from DjangoTemplates
"""
non_django_templates_settings = [
{
"BACKEND": "cms.test_utils.project.template_backends.NonDjangoTemplates",
"DIRS": [],
"OPTIONS": {
"context_processors": ["django.template.context_processors.request"],
},
}
]
with override_settings(TEMPLATES=non_django_templates_settings):
from cms.utils.setup import validate_settings
with self.assertRaises(ImproperlyConfigured) as context:
validate_settings()
self.assertIn(
"django.template.backends.django.DjangoTemplates",
str(context.exception),
"Should reject non-Django template backends",
)