feat: add SYNCABLE_KEYS allowlist and settings_updated_at to settings
This commit is contained in:
@@ -41,8 +41,31 @@ DEFAULT_SETTINGS: dict = {
|
|||||||
"activityIndicator": "both",
|
"activityIndicator": "both",
|
||||||
"gridViewMode": "flat",
|
"gridViewMode": "flat",
|
||||||
"sidebarOpen": None,
|
"sidebarOpen": None,
|
||||||
|
"settings_updated_at": 0.0,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SYNCABLE_KEYS: frozenset[str] = frozenset(
|
||||||
|
{
|
||||||
|
# Display preferences
|
||||||
|
"fontSize",
|
||||||
|
"hoverPreviewDelay",
|
||||||
|
"gridColumns",
|
||||||
|
"bellSound",
|
||||||
|
"viewMode",
|
||||||
|
"showDeviceBadges",
|
||||||
|
"showHoverPreview",
|
||||||
|
"activityIndicator",
|
||||||
|
"gridViewMode",
|
||||||
|
"sidebarOpen",
|
||||||
|
# Session behavior
|
||||||
|
"sort_order",
|
||||||
|
"hidden_sessions",
|
||||||
|
"default_session",
|
||||||
|
"window_size_largest",
|
||||||
|
"auto_open_created",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def load_settings() -> dict:
|
def load_settings() -> dict:
|
||||||
"""Load settings from disk, merging saved values over defaults.
|
"""Load settings from disk, merging saved values over defaults.
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import pytest
|
|||||||
import muxplex.settings as settings_mod
|
import muxplex.settings as settings_mod
|
||||||
from muxplex.settings import (
|
from muxplex.settings import (
|
||||||
DEFAULT_SETTINGS,
|
DEFAULT_SETTINGS,
|
||||||
|
SYNCABLE_KEYS,
|
||||||
load_federation_key,
|
load_federation_key,
|
||||||
load_settings,
|
load_settings,
|
||||||
patch_settings,
|
patch_settings,
|
||||||
@@ -844,3 +845,76 @@ def test_display_settings_round_trip_via_patch():
|
|||||||
assert loaded[key] == expected, (
|
assert loaded[key] == expected, (
|
||||||
f"load_settings() must return persisted {key}={expected!r}, got: {loaded[key]!r}"
|
f"load_settings() must return persisted {key}={expected!r}, got: {loaded[key]!r}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# SYNCABLE_KEYS allowlist and settings_updated_at (task-5)
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
|
||||||
|
def test_syncable_keys_is_frozenset():
|
||||||
|
"""SYNCABLE_KEYS must be a frozenset."""
|
||||||
|
assert isinstance(SYNCABLE_KEYS, frozenset)
|
||||||
|
|
||||||
|
|
||||||
|
def test_syncable_keys_contains_display_settings():
|
||||||
|
"""SYNCABLE_KEYS must include all display preference keys."""
|
||||||
|
display_keys = {
|
||||||
|
"fontSize",
|
||||||
|
"hoverPreviewDelay",
|
||||||
|
"gridColumns",
|
||||||
|
"bellSound",
|
||||||
|
"viewMode",
|
||||||
|
"showDeviceBadges",
|
||||||
|
"showHoverPreview",
|
||||||
|
"activityIndicator",
|
||||||
|
"gridViewMode",
|
||||||
|
"sidebarOpen",
|
||||||
|
}
|
||||||
|
assert display_keys.issubset(SYNCABLE_KEYS)
|
||||||
|
|
||||||
|
|
||||||
|
def test_syncable_keys_contains_session_behavior():
|
||||||
|
"""SYNCABLE_KEYS must include session behavior keys."""
|
||||||
|
session_keys = {
|
||||||
|
"sort_order",
|
||||||
|
"hidden_sessions",
|
||||||
|
"default_session",
|
||||||
|
"window_size_largest",
|
||||||
|
"auto_open_created",
|
||||||
|
}
|
||||||
|
assert session_keys.issubset(SYNCABLE_KEYS)
|
||||||
|
|
||||||
|
|
||||||
|
def test_syncable_keys_excludes_infrastructure():
|
||||||
|
"""SYNCABLE_KEYS must NOT include infrastructure/identity keys."""
|
||||||
|
infra_keys = {
|
||||||
|
"host",
|
||||||
|
"port",
|
||||||
|
"auth",
|
||||||
|
"session_ttl",
|
||||||
|
"tls_cert",
|
||||||
|
"tls_key",
|
||||||
|
"device_name",
|
||||||
|
"federation_key",
|
||||||
|
"remote_instances",
|
||||||
|
"multi_device_enabled",
|
||||||
|
"new_session_template",
|
||||||
|
"delete_session_template",
|
||||||
|
}
|
||||||
|
assert SYNCABLE_KEYS.isdisjoint(infra_keys)
|
||||||
|
|
||||||
|
|
||||||
|
def test_syncable_keys_excludes_settings_updated_at():
|
||||||
|
"""settings_updated_at is metadata, not a syncable key."""
|
||||||
|
assert "settings_updated_at" not in SYNCABLE_KEYS
|
||||||
|
|
||||||
|
|
||||||
|
def test_syncable_keys_subset_of_default_settings():
|
||||||
|
"""Every SYNCABLE_KEY must exist in DEFAULT_SETTINGS."""
|
||||||
|
assert SYNCABLE_KEYS.issubset(DEFAULT_SETTINGS.keys())
|
||||||
|
|
||||||
|
|
||||||
|
def test_defaults_include_settings_updated_at():
|
||||||
|
"""DEFAULT_SETTINGS must include settings_updated_at with default 0.0."""
|
||||||
|
assert DEFAULT_SETTINGS["settings_updated_at"] == 0.0
|
||||||
|
|||||||
Reference in New Issue
Block a user