From 5ee651f2555f3258b136f6e8be90f018fd8ffbf0 Mon Sep 17 00:00:00 2001 From: Senthil Kumar Date: Wed, 16 Jul 2025 20:54:21 +0800 Subject: Fixed #36369 -- Cleared additional cached properties in apps.clear_cache(). Thanks Clifford Gama for the report. Co-authored-by: Jacob Walls --- tests/apps/tests.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'tests') diff --git a/tests/apps/tests.py b/tests/apps/tests.py index 0f395b7fc3..ce7e19be1d 100644 --- a/tests/apps/tests.py +++ b/tests/apps/tests.py @@ -14,6 +14,7 @@ from django.test import ( skipUnlessDBFeature, ) from django.test.utils import extend_sys_path, isolate_apps +from django.utils.functional import cached_property from .models import SoAlternative, TotallyNormal, new_apps from .one_config_app.apps import OneConfig @@ -215,6 +216,27 @@ class AppsTests(SimpleTestCase): self.assertEqual(apps.get_swappable_settings_name.cache_info().currsize, 0) self.assertEqual(apps.get_models.cache_info().currsize, 0) + @override_settings(INSTALLED_APPS=SOME_INSTALLED_APPS) + def test_cached_properties_cleared_after_cache_clear(self): + opts = apps.get_model("admin", "LogEntry")._meta + + cached_properties = [ + name + for name, attr in models.options.Options.__dict__.items() + if isinstance(attr, cached_property) + ] + + # Access each cached property to populate the cache. + for attr_name in cached_properties: + getattr(opts, attr_name) + self.assertIn(attr_name, opts.__dict__) + + apps.clear_cache() + + for attr_name in cached_properties: + with self.subTest(property=attr_name): + self.assertNotIn(attr_name, opts.__dict__) + @override_settings(INSTALLED_APPS=["apps.apps.RelabeledAppsConfig"]) def test_relabeling(self): self.assertEqual(apps.get_app_config("relabeled").name, "apps") -- cgit v1.3