123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- from pathlib import Path
- from unittest import mock
- from django.template import autoreload
- from django.test import SimpleTestCase, override_settings
- from django.test.utils import require_jinja2
- ROOT = Path(__file__).parent.absolute()
- EXTRA_TEMPLATES_DIR = ROOT / "templates_extra"
- @override_settings(
- INSTALLED_APPS=["template_tests"],
- TEMPLATES=[
- {
- "BACKEND": "django.template.backends.dummy.TemplateStrings",
- "APP_DIRS": True,
- },
- {
- "BACKEND": "django.template.backends.django.DjangoTemplates",
- "DIRS": [EXTRA_TEMPLATES_DIR],
- "OPTIONS": {
- "context_processors": [
- "django.template.context_processors.request",
- ],
- "loaders": [
- "django.template.loaders.filesystem.Loader",
- "django.template.loaders.app_directories.Loader",
- ],
- },
- },
- ],
- )
- class TemplateReloadTests(SimpleTestCase):
- @mock.patch("django.template.autoreload.reset_loaders")
- def test_template_changed(self, mock_reset):
- template_path = Path(__file__).parent / "templates" / "index.html"
- self.assertTrue(autoreload.template_changed(None, template_path))
- mock_reset.assert_called_once()
- @mock.patch("django.template.autoreload.reset_loaders")
- def test_non_template_changed(self, mock_reset):
- self.assertIsNone(autoreload.template_changed(None, Path(__file__)))
- mock_reset.assert_not_called()
- @override_settings(
- TEMPLATES=[
- {
- "DIRS": [ROOT],
- "BACKEND": "django.template.backends.django.DjangoTemplates",
- }
- ]
- )
- @mock.patch("django.template.autoreload.reset_loaders")
- def test_non_template_changed_in_template_directory(self, mock_reset):
- self.assertIsNone(autoreload.template_changed(None, Path(__file__)))
- mock_reset.assert_not_called()
- @mock.patch("django.forms.renderers.get_default_renderer")
- def test_form_template_reset_template_change(self, mock_renderer):
- template_path = Path(__file__).parent / "templates" / "index.html"
- self.assertIs(autoreload.template_changed(None, template_path), True)
- mock_renderer.assert_called_once()
- @mock.patch("django.template.loaders.cached.Loader.reset")
- def test_form_template_reset_template_change_reset_call(self, mock_loader_reset):
- template_path = Path(__file__).parent / "templates" / "index.html"
- self.assertIs(autoreload.template_changed(None, template_path), True)
- mock_loader_reset.assert_called_once()
- @override_settings(FORM_RENDERER="django.forms.renderers.TemplatesSetting")
- @mock.patch("django.template.loaders.cached.Loader.reset")
- def test_form_template_reset_template_change_no_djangotemplates(
- self, mock_loader_reset
- ):
- template_path = Path(__file__).parent / "templates" / "index.html"
- self.assertIs(autoreload.template_changed(None, template_path), True)
- mock_loader_reset.assert_not_called()
- @mock.patch("django.forms.renderers.get_default_renderer")
- def test_form_template_reset_non_template_change(self, mock_renderer):
- self.assertIsNone(autoreload.template_changed(None, Path(__file__)))
- mock_renderer.assert_not_called()
- def test_watch_for_template_changes(self):
- mock_reloader = mock.MagicMock()
- autoreload.watch_for_template_changes(mock_reloader)
- self.assertSequenceEqual(
- sorted(mock_reloader.watch_dir.call_args_list),
- [
- mock.call(ROOT / "templates", "**/*"),
- mock.call(ROOT / "templates_extra", "**/*"),
- ],
- )
- def test_get_template_directories(self):
- self.assertSetEqual(
- autoreload.get_template_directories(),
- {
- ROOT / "templates_extra",
- ROOT / "templates",
- },
- )
- @mock.patch("django.template.loaders.base.Loader.reset")
- def test_reset_all_loaders(self, mock_reset):
- autoreload.reset_loaders()
- self.assertEqual(mock_reset.call_count, 2)
- @override_settings(
- TEMPLATES=[
- {
- "DIRS": [""],
- "BACKEND": "django.template.backends.django.DjangoTemplates",
- }
- ]
- )
- def test_template_dirs_ignore_empty_path(self):
- self.assertEqual(autoreload.get_template_directories(), set())
- @override_settings(
- TEMPLATES=[
- {
- "DIRS": [
- str(ROOT) + "/absolute_str",
- "template_tests/relative_str",
- Path("template_tests/relative_path"),
- ],
- "BACKEND": "django.template.backends.django.DjangoTemplates",
- }
- ]
- )
- def test_template_dirs_normalized_to_paths(self):
- self.assertSetEqual(
- autoreload.get_template_directories(),
- {
- ROOT / "absolute_str",
- Path.cwd() / "template_tests/relative_str",
- Path.cwd() / "template_tests/relative_path",
- },
- )
- @require_jinja2
- @override_settings(INSTALLED_APPS=["template_tests"])
- class Jinja2TemplateReloadTests(SimpleTestCase):
- def test_watch_for_template_changes(self):
- mock_reloader = mock.MagicMock()
- autoreload.watch_for_template_changes(mock_reloader)
- self.assertSequenceEqual(
- sorted(mock_reloader.watch_dir.call_args_list),
- [
- mock.call(ROOT / "templates", "**/*"),
- ],
- )
- def test_get_template_directories(self):
- self.assertSetEqual(
- autoreload.get_template_directories(),
- {
- ROOT / "templates",
- },
- )
- @mock.patch("django.template.loaders.base.Loader.reset")
- def test_reset_all_loaders(self, mock_reset):
- autoreload.reset_loaders()
- self.assertEqual(mock_reset.call_count, 0)
|