mirror of
				https://github.com/django/django.git
				synced 2025-10-30 17:16:10 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			169 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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,
 | |
|     check_file_based_cache_is_absolute,
 | |
| )
 | |
| 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.
 | |
|         """
 | |
|         self.assertEqual(check_default_cache_is_configured(None), [])
 | |
| 
 | |
|     @override_settings(CACHES=INVALID_CACHES_CONFIGURATION)
 | |
|     def test_default_cache_not_included(self):
 | |
|         """
 | |
|         Error if 'default' not present in CACHES setting.
 | |
|         """
 | |
|         self.assertEqual(check_default_cache_is_configured(None), [E001])
 | |
| 
 | |
| 
 | |
| 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), [])
 | |
| 
 | |
|     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), [])
 | |
| 
 | |
| 
 | |
| 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",
 | |
|                     ),
 | |
|                 ],
 | |
|             )
 |