UX-13 P2: test_settings reads fields through named_absence
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LyR88rXETvwhTgx6yHE39p
This commit is contained in:
@@ -31,6 +31,7 @@ import translations_lint as TL # noqa: E402
|
|||||||
import ux13_demo as D # noqa: E402
|
import ux13_demo as D # noqa: E402
|
||||||
from app import selfconfig, uilayout as L, uimodel as U, uipage, web # noqa: E402
|
from app import selfconfig, uilayout as L, uimodel as U, uipage, web # noqa: E402
|
||||||
from app.validate import validate_startup_config # noqa: E402
|
from app.validate import validate_startup_config # noqa: E402
|
||||||
|
from named_absence import field # noqa: E402
|
||||||
|
|
||||||
fails = []
|
fails = []
|
||||||
|
|
||||||
@@ -78,6 +79,7 @@ for _g in LAYOUT["groups"]:
|
|||||||
_flat.append((_g["id"], _f))
|
_flat.append((_g["id"], _f))
|
||||||
_flat += [(_g["id"], _s) for _s in _f.get("fields", [])]
|
_flat += [(_g["id"], _s) for _s in _f.get("fields", [])]
|
||||||
_keys = [f["key"] for _g, f in _flat]
|
_keys = [f["key"] for _g, f in _flat]
|
||||||
|
FIELD = {f["key"]: f for _g, f in _flat}
|
||||||
check("the six groups, in the design's order",
|
check("the six groups, in the design's order",
|
||||||
[g["id"] for g in LAYOUT["groups"]]
|
[g["id"] for g in LAYOUT["groups"]]
|
||||||
== ["meter", "inverters", "tariff", "safety", "maintenance", "tuning"]
|
== ["meter", "inverters", "tariff", "safety", "maintenance", "tuning"]
|
||||||
@@ -93,7 +95,7 @@ print(f" fields per group: {_counts}")
|
|||||||
check("every field has a label, and every option field's label is its "
|
check("every field has a label, and every option field's label is its "
|
||||||
"translation without the group prefix",
|
"translation without the group prefix",
|
||||||
all(f["label"] and " · " not in f["label"] for _g, f in _flat)
|
all(f["label"] and " · " not in f["label"] for _g, f in _flat)
|
||||||
and next(f for _g, f in _flat if f["key"] == "meter_source")["label"]
|
and field(FIELD, "meter_source")["label"]
|
||||||
== "Where the meter reading comes from")
|
== "Where the meter reading comes from")
|
||||||
_ranged = [(f["key"], f.get("min"), f.get("max")) for _g, f in _flat
|
_ranged = [(f["key"], f.get("min"), f.get("max")) for _g, f in _flat
|
||||||
if f["control"] in (L.SLIDER, L.LOCKED)]
|
if f["control"] in (L.SLIDER, L.LOCKED)]
|
||||||
@@ -102,16 +104,16 @@ check(f"every slider and locked value has its range from the schema "
|
|||||||
for _k, lo, hi in _ranged)
|
for _k, lo, hi in _ranged)
|
||||||
and ("peak_cap_w", 500.0, 15000.0) in _ranged)
|
and ("peak_cap_w", 500.0, 15000.0) in _ranged)
|
||||||
check("the peak limit is a kW slider over a value stored in W",
|
check("the peak limit is a kW slider over a value stored in W",
|
||||||
next(f for _g, f in _flat if f["key"] == "peak_cap_w")["scale"] == 1000)
|
field(FIELD, "peak_cap_w")["scale"] == 1000)
|
||||||
_choice = [f for _g, f in _flat
|
_choice = [f for _g, f in _flat
|
||||||
if f["control"] in (L.SEGMENTED, L.SELECT, L.CHOICE)]
|
if f["control"] in (L.SEGMENTED, L.SELECT, L.CHOICE)]
|
||||||
check("every choice control has choices with words",
|
check("every choice control has choices with words",
|
||||||
all(f["choices"] and all(c[1] for c in f["choices"]) for f in _choice))
|
all(f["choices"] and all(c[1] for c in f["choices"]) for f in _choice))
|
||||||
_ms = next(f for _g, f in _flat if f["key"] == "meter_source")
|
_ms = field(FIELD, "meter_source")
|
||||||
check("the meter source is radio cards with a line of help on each",
|
check("the meter source is radio cards with a line of help on each",
|
||||||
_ms["control"] == L.CHOICE and set(_ms["hints"]) == {c[0] for c in
|
_ms["control"] == L.CHOICE and set(_ms["hints"]) == {c[0] for c in
|
||||||
_ms["choices"]})
|
_ms["choices"]})
|
||||||
_reg = next(f for _g, f in _flat if f["key"] == "ui.region")
|
_reg = field(FIELD, "ui.region")
|
||||||
check("the region shows its preset year beside the choice (P0 review)",
|
check("the region shows its preset year beside the choice (P0 review)",
|
||||||
["flanders", "Flanders, Fluvius Antwerpen, 2026 figures", False]
|
["flanders", "Flanders, Fluvius Antwerpen, 2026 figures", False]
|
||||||
in _reg["choices"] and _reg["presets"]["flanders"]["year"] == 2026)
|
in _reg["choices"] and _reg["presets"]["flanders"]["year"] == 2026)
|
||||||
@@ -129,14 +131,14 @@ check(f"measured and derived values are locked behind 'Change' "
|
|||||||
check("each group says when its settings apply",
|
check("each group says when its settings apply",
|
||||||
all(g["applies"] == [UI_TEXT["applies"]["restart"]["name"]]
|
all(g["applies"] == [UI_TEXT["applies"]["restart"]["name"]]
|
||||||
for g in LAYOUT["groups"]))
|
for g in LAYOUT["groups"]))
|
||||||
_inv = next(f for _g, f in _flat if f["key"] == "inverters")
|
_inv = field(FIELD, "inverters")
|
||||||
check("the inverter cards carry their count, and adding one makes a list",
|
check("the inverter cards carry their count, and adding one makes a list",
|
||||||
_inv["count"] == U.COUNT and _inv["grow"] == U.GROWN
|
_inv["count"] == U.COUNT and _inv["grow"] == U.GROWN
|
||||||
and [s["key"] for s in _inv["fields"]]
|
and [s["key"] for s in _inv["fields"]]
|
||||||
== [f.key for f in L.ROSTER_FIELDS])
|
== [f.key for f in L.ROSTER_FIELDS])
|
||||||
check("a page-only field names the option keys it writes, for the grey key "
|
check("a page-only field names the option keys it writes, for the grey key "
|
||||||
"line", _reg["writes"] == ["price_taxes_profile"]
|
"line", _reg["writes"] == ["price_taxes_profile"]
|
||||||
and next(f for _g, f in _flat if f["key"] == "ui.solar")["writes"]
|
and field(FIELD, "ui.solar")["writes"]
|
||||||
== ["pv_entities", "pv_entity", "pv_invert_entities"])
|
== ["pv_entities", "pv_entity", "pv_invert_entities"])
|
||||||
check("without a Supervisor schema the page still draws, with no ranges",
|
check("without a Supervisor schema the page still draws, with no ranges",
|
||||||
len(uipage.layout([], {})["groups"]) == 6)
|
len(uipage.layout([], {})["groups"]) == 6)
|
||||||
|
|||||||
Reference in New Issue
Block a user