Files
odysseus/tests/test_load_features_permission_error.py
T
Mazen Tamer Salah f5c1eb4b9d fix(settings): degrade load_features to defaults on PermissionError
load_settings() already catches PermissionError, but load_features() caught only
FileNotFoundError/JSONDecodeError/ValueError. An existing-but-unreadable
data/features.json (e.g. root-owned after a deploy) therefore raised instead of
falling back to DEFAULT_FEATURES, taking down GET /api/auth/features and anything
that reads feature flags. Add PermissionError to the except tuple to match
load_settings().

Adds tests/test_load_features_permission_error.py.

Co-authored-by: Alexandre Teixeira <111787685+alteixeira20@users.noreply.github.com>
2026-06-11 21:20:10 +01:00

27 lines
918 B
Python

"""load_features() must degrade to defaults if features.json is unreadable.
load_settings() already catches PermissionError, but load_features() did not, so
an unreadable data/features.json (e.g. root-owned after a deploy) raised instead
of falling back to DEFAULT_FEATURES, taking down GET /api/auth/features.
"""
import builtins
import src.settings as settings
def test_load_features_degrades_on_permission_error(monkeypatch):
# Ensure the cache does not short-circuit the read.
monkeypatch.setattr(settings, "_features_cache", None, raising=False)
real_open = builtins.open
def deny(path, *args, **kwargs):
if str(path) == str(settings.FEATURES_FILE):
raise PermissionError("denied")
return real_open(path, *args, **kwargs)
monkeypatch.setattr(builtins, "open", deny)
result = settings.load_features()
assert result == dict(settings.DEFAULT_FEATURES)