from __future__ import annotations from govoplan_core.core.appearance import resolve_effective_appearance, update_appearance_settings def test_appearance_precedence_and_inheritance() -> None: decision = resolve_effective_appearance( system_settings={"appearance": {"default_palette": "civic_blue"}}, tenant_settings={"appearance": {"default_palette": "forest"}}, user_settings={"ui": {"palette": "plum"}}, ) assert (decision.palette, decision.source, decision.locked) == ("plum", "user", False) inherited = resolve_effective_appearance( system_settings={"appearance": {"default_palette": "civic_blue"}}, tenant_settings={"appearance": {"default_palette": "forest"}}, user_settings={"ui": {"palette": None}}, ) assert (inherited.palette, inherited.source) == ("forest", "tenant") def test_system_lock_wins_and_invalid_values_fail_safe() -> None: decision = resolve_effective_appearance( system_settings={"appearance": {"default_palette": "civic_blue", "palette_locked": True}}, tenant_settings={"appearance": {"default_palette": "forest", "palette_locked": True}}, user_settings={"ui": {"palette": "plum"}}, ) assert decision.as_dict() == { "palette": "civic_blue", "source": "system_lock", "locked": True, "system_default_palette": "civic_blue", "tenant_default_palette": "forest", "inherited_palette": "civic_blue", } fallback = resolve_effective_appearance( system_settings={"appearance": {"default_palette": "unsafe"}}, tenant_settings={}, user_settings={"ui": {"palette": "unknown"}}, ) assert (fallback.palette, fallback.source) == ("default", "system") def test_appearance_settings_reset_without_touching_neighbors() -> None: configured = update_appearance_settings( {"neighbor": {"kept": True}}, default_palette="forest", palette_locked=True, ) assert configured["neighbor"] == {"kept": True} assert configured["appearance"] == {"default_palette": "forest", "palette_locked": True} assert update_appearance_settings(configured, default_palette=None, palette_locked=False) == { "neighbor": {"kept": True} }