2020-10-27 00:01:03 +08:00
|
|
|
import pathlib
|
|
|
|
|
|
|
|
from django.core.checks import Warning
|
|
|
|
from django.core.checks.caches import (
|
|
|
|
E001,
|
|
|
|
check_cache_location_not_exposed,
|
|
|
|
check_default_cache_is_configured,
|
2020-11-08 22:57:51 +08:00
|
|
|
check_file_based_cache_is_absolute,
|
2020-10-27 00:01:03 +08:00
|
|
|
)
|
2015-09-02 20:20:46 +08:00
|
|
|
from django.test import SimpleTestCase
|
|
|
|
from django.test.utils import override_settings
|
|
|
|
|
|
|
|
|
|
|
|
class CheckCacheSettingsAppDirsTest(SimpleTestCase):
|
|
|
|
VALID_CACHES_CONFIGURATION = {
|
|
|
|
"default": {
|
|
|
|
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
INVALID_CACHES_CONFIGURATION = {
|
|
|
|
"other": {
|
|
|
|
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
@override_settings(CACHES=VALID_CACHES_CONFIGURATION)
|
|
|
|
def test_default_cache_included(self):
|
|
|
|
"""
|
|
|
|
Don't error if 'default' is present in CACHES setting.
|
|
|
|
"""
|
2020-03-22 03:14:02 +08:00
|
|
|
self.assertEqual(check_default_cache_is_configured(None), [])
|
2015-09-02 20:20:46 +08:00
|
|
|
|
|
|
|
@override_settings(CACHES=INVALID_CACHES_CONFIGURATION)
|
|
|
|
def test_default_cache_not_included(self):
|
|
|
|
"""
|
|
|
|
Error if 'default' not present in CACHES setting.
|
|
|
|
"""
|
2020-03-22 03:14:02 +08:00
|
|
|
self.assertEqual(check_default_cache_is_configured(None), [E001])
|
2020-10-27 00:01:03 +08:00
|
|
|
|
|
|
|
|
|
|
|
class CheckCacheLocationTest(SimpleTestCase):
|
|
|
|
warning_message = (
|
|
|
|
"Your 'default' cache configuration might expose your cache or lead "
|
|
|
|
"to corruption of your data because its LOCATION %s %s."
|
|
|
|
)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def get_settings(setting, cache_path, setting_path):
|
|
|
|
return {
|
|
|
|
"CACHES": {
|
|
|
|
"default": {
|
|
|
|
"BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
|
|
|
|
"LOCATION": cache_path,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
setting: [setting_path] if setting == "STATICFILES_DIRS" else setting_path,
|
|
|
|
}
|
|
|
|
|
|
|
|
def test_cache_path_matches_media_static_setting(self):
|
|
|
|
root = pathlib.Path.cwd()
|
|
|
|
for setting in ("MEDIA_ROOT", "STATIC_ROOT", "STATICFILES_DIRS"):
|
|
|
|
settings = self.get_settings(setting, root, root)
|
|
|
|
with self.subTest(setting=setting), self.settings(**settings):
|
|
|
|
msg = self.warning_message % ("matches", setting)
|
|
|
|
self.assertEqual(
|
|
|
|
check_cache_location_not_exposed(None),
|
|
|
|
[
|
|
|
|
Warning(msg, id="caches.W002"),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_cache_path_inside_media_static_setting(self):
|
|
|
|
root = pathlib.Path.cwd()
|
|
|
|
for setting in ("MEDIA_ROOT", "STATIC_ROOT", "STATICFILES_DIRS"):
|
|
|
|
settings = self.get_settings(setting, root / "cache", root)
|
|
|
|
with self.subTest(setting=setting), self.settings(**settings):
|
|
|
|
msg = self.warning_message % ("is inside", setting)
|
|
|
|
self.assertEqual(
|
|
|
|
check_cache_location_not_exposed(None),
|
|
|
|
[
|
|
|
|
Warning(msg, id="caches.W002"),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_cache_path_contains_media_static_setting(self):
|
|
|
|
root = pathlib.Path.cwd()
|
|
|
|
for setting in ("MEDIA_ROOT", "STATIC_ROOT", "STATICFILES_DIRS"):
|
|
|
|
settings = self.get_settings(setting, root, root / "other")
|
|
|
|
with self.subTest(setting=setting), self.settings(**settings):
|
|
|
|
msg = self.warning_message % ("contains", setting)
|
|
|
|
self.assertEqual(
|
|
|
|
check_cache_location_not_exposed(None),
|
|
|
|
[
|
|
|
|
Warning(msg, id="caches.W002"),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_cache_path_not_conflict(self):
|
|
|
|
root = pathlib.Path.cwd()
|
|
|
|
for setting in ("MEDIA_ROOT", "STATIC_ROOT", "STATICFILES_DIRS"):
|
|
|
|
settings = self.get_settings(setting, root / "cache", root / "other")
|
|
|
|
with self.subTest(setting=setting), self.settings(**settings):
|
|
|
|
self.assertEqual(check_cache_location_not_exposed(None), [])
|
2020-11-08 22:57:51 +08:00
|
|
|
|
2021-04-21 15:41:37 +08:00
|
|
|
def test_staticfiles_dirs_prefix(self):
|
|
|
|
root = pathlib.Path.cwd()
|
|
|
|
tests = [
|
|
|
|
(root, root, "matches"),
|
|
|
|
(root / "cache", root, "is inside"),
|
|
|
|
(root, root / "other", "contains"),
|
|
|
|
]
|
|
|
|
for cache_path, setting_path, msg in tests:
|
|
|
|
settings = self.get_settings(
|
|
|
|
"STATICFILES_DIRS",
|
|
|
|
cache_path,
|
|
|
|
("prefix", setting_path),
|
|
|
|
)
|
|
|
|
with self.subTest(path=setting_path), self.settings(**settings):
|
|
|
|
msg = self.warning_message % (msg, "STATICFILES_DIRS")
|
|
|
|
self.assertEqual(
|
|
|
|
check_cache_location_not_exposed(None),
|
|
|
|
[
|
|
|
|
Warning(msg, id="caches.W002"),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
def test_staticfiles_dirs_prefix_not_conflict(self):
|
|
|
|
root = pathlib.Path.cwd()
|
|
|
|
settings = self.get_settings(
|
|
|
|
"STATICFILES_DIRS",
|
|
|
|
root / "cache",
|
|
|
|
("prefix", root / "other"),
|
|
|
|
)
|
|
|
|
with self.settings(**settings):
|
|
|
|
self.assertEqual(check_cache_location_not_exposed(None), [])
|
|
|
|
|
2020-11-08 22:57:51 +08:00
|
|
|
|
|
|
|
class CheckCacheAbsolutePath(SimpleTestCase):
|
|
|
|
def test_absolute_path(self):
|
|
|
|
with self.settings(
|
|
|
|
CACHES={
|
|
|
|
"default": {
|
|
|
|
"BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
|
|
|
|
"LOCATION": pathlib.Path.cwd() / "cache",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
):
|
|
|
|
self.assertEqual(check_file_based_cache_is_absolute(None), [])
|
|
|
|
|
|
|
|
def test_relative_path(self):
|
|
|
|
with self.settings(
|
|
|
|
CACHES={
|
|
|
|
"default": {
|
|
|
|
"BACKEND": "django.core.cache.backends.filebased.FileBasedCache",
|
|
|
|
"LOCATION": "cache",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
):
|
|
|
|
self.assertEqual(
|
|
|
|
check_file_based_cache_is_absolute(None),
|
|
|
|
[
|
|
|
|
Warning(
|
|
|
|
"Your 'default' cache LOCATION path is relative. Use an "
|
|
|
|
"absolute path instead.",
|
|
|
|
id="caches.W003",
|
|
|
|
),
|
|
|
|
],
|
|
|
|
)
|