From c91b1f983241b08c90451cb1925249b6cacb8d1f Mon Sep 17 00:00:00 2001 From: seaspotter Date: Wed, 21 Oct 2026 16:49:08 +0200 Subject: [PATCH] =?UTF-8?q?Prognose:=20leeren=20Store=20beim=20Zyklus-Spli?= =?UTF-8?q?t=20nicht=20mehr=20f=C3=A4lschlich=20publizieren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/configurable_forecast_test.py | 6 ++++++ packages/modules/common/store/_forecast.py | 3 +-- .../modules/common/store/_forecast_test.py | 19 +++++++++++++++---- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/modules/common/configurable_forecast_test.py b/packages/modules/common/configurable_forecast_test.py index ca6fc57c1c..2c2b772e83 100644 --- a/packages/modules/common/configurable_forecast_test.py +++ b/packages/modules/common/configurable_forecast_test.py @@ -19,3 +19,9 @@ def test_store_update_runs_even_when_no_fetch_is_due(): forecast.store.update.assert_called_once() forecast.store.set.assert_not_called() forecast._component_updater.assert_not_called() + + +def test_real_store_does_not_crash_before_first_fetch(): + forecast = _make_forecast() + + forecast.update() diff --git a/packages/modules/common/store/_forecast.py b/packages/modules/common/store/_forecast.py index 35c9fb4d1b..8955c0f4db 100644 --- a/packages/modules/common/store/_forecast.py +++ b/packages/modules/common/store/_forecast.py @@ -34,8 +34,7 @@ def _filter_values_for_date(values: Dict[str, float], target_date) -> Dict[str, class ForecastValueStore(ValueStore[ForecastState]): def __init__(self): - # erlaubt update() bereits vor dem ersten Abruf - self.state = ForecastState() + pass def set(self, state: ForecastState) -> None: self.state = state diff --git a/packages/modules/common/store/_forecast_test.py b/packages/modules/common/store/_forecast_test.py index 52ff788ccc..e26c2bf925 100644 --- a/packages/modules/common/store/_forecast_test.py +++ b/packages/modules/common/store/_forecast_test.py @@ -9,6 +9,7 @@ from control.optional import Optional from modules.common.component_state import ForecastState from modules.common.store import _forecast +from modules.common.store._api import LoggingValueStore from modules.common.store._forecast import ForecastValueStore @@ -70,10 +71,20 @@ def test_update_reruns_split_after_midnight_without_new_fetch(monkeypatch: pytes assert data.data.optional_data.data.forecast.get.tomorrow_kwh == 0.0 -def test_update_safe_before_first_fetch(): - # ForecastValueStore() muss schon vor dem ersten set() aufrufbar sein (siehe - # ConfigurableForecast.update(), das update() auch ohne fälligen Abruf jeden Zyklus ruft) - ForecastValueStore().update() +def test_update_before_first_fetch_raises_attribute_error(): + # signalisiert LoggingValueStore.update(), dass noch nichts zu publizieren ist + with pytest.raises(AttributeError): + ForecastValueStore().update() + + +def test_logging_store_swallows_missing_state_as_safe_noop(monkeypatch: pytest.MonkeyPatch): + store = LoggingValueStore(ForecastValueStore()) + pub = Mock() + monkeypatch.setattr(_forecast, "pub_to_broker", pub) + + store.update() + + pub.assert_not_called() def test_dst_transition_does_not_shift_day_boundary(monkeypatch: pytest.MonkeyPatch):