- Enhanced the KPI board widget to support tile configuration, allowing users to select and order tiles. - Updated validation logic to ensure proper handling of tile IDs and configuration fields. - Removed legacy chart_days support, transitioning to a fixed analysis window for KPI metrics. - Improved the DashboardLabPage to integrate the new KpiBoardConfigEditor for managing tile selections. - Bumped app_dashboard version to 1.5.0 to reflect these significant changes.
87 lines
3.2 KiB
Python
87 lines
3.2 KiB
Python
import pytest
|
|
|
|
from dashboard_layout_schema import DashboardLayoutPayload, coalesce_effective_layout, default_layout_dict
|
|
from dashboard_widget_config import validate_widget_entry_config
|
|
|
|
|
|
def test_body_chart_days_bounds():
|
|
assert validate_widget_entry_config("body_overview", {"chart_days": 7}) == {"chart_days": 7}
|
|
assert validate_widget_entry_config("body_overview", {"chart_days": 90}) == {"chart_days": 90}
|
|
assert validate_widget_entry_config("body_overview", {"chart_days": 42.0}) == {"chart_days": 42}
|
|
with pytest.raises(ValueError):
|
|
validate_widget_entry_config("body_overview", {"chart_days": 6})
|
|
with pytest.raises(ValueError):
|
|
validate_widget_entry_config("body_overview", {"chart_days": 91})
|
|
|
|
|
|
def test_welcome_config_rejected_unknown_key():
|
|
with pytest.raises(ValueError):
|
|
validate_widget_entry_config("welcome", {"x": 1})
|
|
|
|
|
|
def test_body_unknown_key():
|
|
with pytest.raises(ValueError):
|
|
validate_widget_entry_config("body_overview", {"chart_days": 30, "extra": 1})
|
|
|
|
|
|
def test_activity_chart_days():
|
|
assert validate_widget_entry_config("activity_overview", {"chart_days": 14}) == {"chart_days": 14}
|
|
with pytest.raises(ValueError):
|
|
validate_widget_entry_config("activity_overview", {"chart_days": 5})
|
|
|
|
|
|
def test_kpi_board_tiles():
|
|
assert validate_widget_entry_config("kpi_board", {}) == {}
|
|
assert validate_widget_entry_config("kpi_board", {"tiles": []}) == {"tiles": []}
|
|
assert validate_widget_entry_config(
|
|
"kpi_board",
|
|
{"tiles": [{"id": "body_fat"}, {"id": "avg_kcal"}, {"id": "ref:hr_max"}]},
|
|
) == {"tiles": [{"id": "body_fat"}, {"id": "avg_kcal"}, {"id": "ref:hr_max"}]}
|
|
with pytest.raises(ValueError):
|
|
validate_widget_entry_config("kpi_board", {"tiles": [{"id": "unknown"}]})
|
|
with pytest.raises(ValueError):
|
|
validate_widget_entry_config("kpi_board", {"tiles": [{"id": "body_fat"}, {"id": "body_fat"}]})
|
|
with pytest.raises(ValueError):
|
|
validate_widget_entry_config("kpi_board", {"extra": 1})
|
|
|
|
|
|
def test_kpi_board_legacy_chart_days_dropped():
|
|
"""Nur chart_days (Alt-Layouts) → automatische Kachelwahl, kein Ø-Kal-Fenster mehr."""
|
|
assert validate_widget_entry_config("kpi_board", {"chart_days": 14}) == {}
|
|
assert validate_widget_entry_config("kpi_board", {"chart_days": 5}) == {}
|
|
|
|
|
|
def test_welcome_still_rejects_config():
|
|
with pytest.raises(ValueError):
|
|
validate_widget_entry_config("welcome", {"chart_days": 30})
|
|
|
|
|
|
def test_layout_payload_with_chart_days_roundtrip():
|
|
p = DashboardLayoutPayload.model_validate(
|
|
{
|
|
"version": 1,
|
|
"widgets": [
|
|
{"id": "welcome", "enabled": True},
|
|
{
|
|
"id": "body_overview",
|
|
"enabled": True,
|
|
"config": {"chart_days": 42},
|
|
},
|
|
],
|
|
}
|
|
)
|
|
d = p.to_stored_dict()
|
|
assert d["widgets"][1]["config"]["chart_days"] == 42
|
|
|
|
|
|
def test_coalesce_rejects_invalid_widget_config():
|
|
raw = {
|
|
"version": 1,
|
|
"widgets": [
|
|
{"id": "welcome", "enabled": True, "config": {"evil": True}},
|
|
],
|
|
}
|
|
custom, eff = coalesce_effective_layout(raw)
|
|
assert custom is False
|
|
assert eff == default_layout_dict()
|