fix: invalidate request level cache on settings update instead of turning off cache for requests

This commit is contained in:
Andrii V 2025-08-08 18:13:46 +02:00
parent 2901c4546b
commit 6ef0c46ffb

View file

@ -315,43 +315,39 @@ class TestAdminSettingsVcs(object):
setting = SettingsModel().get_setting_by_name(setting_key) setting = SettingsModel().get_setting_by_name(setting_key)
assert setting.app_settings_value is new_value assert setting.app_settings_value is new_value
def test_vcs_settings_cache_consistency(self, form_defaults, csrf_token): def test_vcs_settings_cache_invalidation(self, form_defaults, csrf_token):
"""Test that VCS settings show fresh values after update (cache bug fix)."""
from rhodecode.apps.admin.views.settings import AdminSettingsView from rhodecode.apps.admin.views.settings import AdminSettingsView
# Test PR and diff cache settings that were affected by the cache bug # Test settings that were bugged
settings_to_test = { settings_to_test = {
"pr_merge_enabled": False, "pr_merge_enabled": False,
"diff_cache": True, "diff_cache": True,
"auto_merge_enabled": False, "auto_merge_enabled": False,
} }
# Also test UI setting for repository size hook # Also test some UI setting for comparison, those worked fine
ui_settings_to_test = { ui_settings_to_test = {
"hooks_changegroup_repo_size": True, "hooks_changegroup_repo_size": True,
} }
# Update form with new values for regular settings # Update form with new values
for setting_key, new_value in settings_to_test.items(): for setting_key, new_value in settings_to_test.items():
form_defaults[f"rhodecode_{setting_key}"] = str(new_value).lower() form_defaults[f"rhodecode_{setting_key}"] = str(new_value).lower()
# Update form with new values for UI settings
for ui_key, new_value in ui_settings_to_test.items(): for ui_key, new_value in ui_settings_to_test.items():
form_defaults[ui_key] = str(new_value).lower() form_defaults[ui_key] = str(new_value).lower()
form_defaults["csrf_token"] = csrf_token form_defaults["csrf_token"] = csrf_token
# Submit the form - this should trigger proper cache invalidation # Submit the form and follow redirect
response = self.app.post(route_path("admin_settings_vcs_update"), params=form_defaults, status=302) response = self.app.post(route_path("admin_settings_vcs_update"), params=form_defaults, status=302)
response = response.follow() _ = response.follow()
# Check db has correct values # Check db has correct values
for setting_key, expected_value in settings_to_test.items(): for setting_key, expected_value in settings_to_test.items():
setting = SettingsModel().get_setting_by_name(setting_key) setting = SettingsModel().get_setting_by_name(setting_key)
assert setting.app_settings_value is expected_value assert setting.app_settings_value is expected_value
# Check form defaults should show fresh values (not cached stale ones) # Make sure cache invalidation clears both database and request cache
# This tests that our cache invalidation properly clears both database and request cache
fresh_defaults = AdminSettingsView._form_defaults() fresh_defaults = AdminSettingsView._form_defaults()
for setting_key, expected_value in settings_to_test.items(): for setting_key, expected_value in settings_to_test.items():
form_key = f"rhodecode_{setting_key}" form_key = f"rhodecode_{setting_key}"