mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-10-14 02:56:36 +00:00
fix: address CodeRabbit findings on the style-editor/font-selector PR
- Fix _load_font_sized double-wrapping the (font, size) tuple on the missing-font path, which handed callers a tuple instead of a font. - Fix _set_nested_value skipping an explicit None when the key already existed, which silently kept stale overrides when a user cleared a nullable per-mode field or blanked all channels of an indexed color. - Preserve BDF scalable/native_size metadata through fetchFontCatalog's catalog-format mapping so maxFixedSize filtering actually applies. - Stop caching an empty array on a failed font-catalog fetch so a later call can retry instead of being stuck with the failed result. - Keep a saved font selected in the style editor even when it no longer fits a newly declared maxFixedSize, instead of silently deselecting it. - Don't drop in-progress user edits to fallback fields when a plugin widget finishes loading asynchronously and takes over the form. - Tighten the removed font-override endpoint test to assert 405, not just != 200. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -359,6 +359,19 @@ class TestDegradation:
|
||||
# The override IS honored as forced, but the face degrades safely.
|
||||
assert style.user_forced
|
||||
assert style.font is not None
|
||||
assert not isinstance(style.font, tuple)
|
||||
|
||||
def test_missing_font_load_returns_a_font_not_a_nested_tuple(self):
|
||||
# Regression: the missing-font path in _load_font_sized used to wrap
|
||||
# _load_fallback_font's own (font, size) tuple a second time, so
|
||||
# load_font() returned a (font, size) tuple where callers (draw.text,
|
||||
# layout math) expect a font object.
|
||||
font, size = _load_font_sized("definitely-not-a-real-font.ttf", 8)
|
||||
assert not isinstance(font, tuple)
|
||||
assert size == 8
|
||||
|
||||
single = load_font("definitely-not-a-real-font.ttf", 8)
|
||||
assert not isinstance(single, tuple)
|
||||
|
||||
def test_empty_defaults_treats_config_as_reference_to_classic(self):
|
||||
# No schema defaults at all: a config value equal to the classic
|
||||
|
||||
@@ -825,10 +825,10 @@ class TestFontsAPI:
|
||||
# 405, not 404: the path still matches DELETE /fonts/<font_family>,
|
||||
# which now reads "overrides" as a font name. Nothing is routed to a
|
||||
# handler for GET or POST, which is what matters here.
|
||||
assert client.get('/api/v3/fonts/overrides').status_code != 200
|
||||
assert client.get('/api/v3/fonts/overrides').status_code == 405
|
||||
assert client.post('/api/v3/fonts/overrides',
|
||||
data=json.dumps({}),
|
||||
content_type='application/json').status_code != 200
|
||||
content_type='application/json').status_code == 405
|
||||
|
||||
|
||||
class TestAPIErrorHandling:
|
||||
|
||||
@@ -25,6 +25,7 @@ from web_interface.blueprints.api_v3 import ( # noqa: E402
|
||||
_parse_form_value,
|
||||
_get_schema_property,
|
||||
_set_nested_value,
|
||||
_SKIP_FIELD,
|
||||
)
|
||||
|
||||
|
||||
@@ -221,12 +222,21 @@ class TestSetNestedValue:
|
||||
_set_nested_value(config, "fifa.world.enabled", True)
|
||||
assert config == {"fifa.world": {"enabled": True}}
|
||||
|
||||
def test_none_does_not_overwrite_existing(self):
|
||||
def test_none_overwrites_existing(self):
|
||||
# Regression: None is a real value here (the per-mode "inherit the
|
||||
# base" override for a nullable field, or a blank indexed color
|
||||
# channel) and must replace whatever was already stored. Only the
|
||||
# _SKIP_FIELD sentinel means "leave it alone" -- see the next test.
|
||||
config = {"a": 1}
|
||||
_set_nested_value(config, "a", None)
|
||||
assert config == {"a": 1}
|
||||
assert config == {"a": None}
|
||||
|
||||
def test_none_sets_missing_key(self):
|
||||
config = {}
|
||||
_set_nested_value(config, "a", None)
|
||||
assert config == {"a": None}
|
||||
|
||||
def test_skip_field_does_not_overwrite_existing(self):
|
||||
config = {"a": 1}
|
||||
_set_nested_value(config, "a", _SKIP_FIELD)
|
||||
assert config == {"a": 1}
|
||||
|
||||
Reference in New Issue
Block a user