fix(burst-location): normalize simulation ids
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import importlib.util
|
||||
import sys
|
||||
import types
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
@@ -30,6 +30,24 @@ def _load_burst_location_module():
|
||||
]:
|
||||
ensure_package(package_name)
|
||||
|
||||
def parse_utc_time(value, field_name="datetime"):
|
||||
parsed = value if isinstance(value, datetime) else datetime.fromisoformat(value)
|
||||
if parsed.tzinfo is None:
|
||||
return parsed.replace(tzinfo=timezone.utc)
|
||||
return parsed.astimezone(timezone.utc)
|
||||
|
||||
time_api_module = types.ModuleType("app.services.time_api")
|
||||
time_api_module.parse_utc_time = parse_utc_time
|
||||
time_api_module.extract_date = (
|
||||
lambda value, field_name="date": (
|
||||
value.date()
|
||||
if isinstance(value, datetime)
|
||||
else datetime.fromisoformat(value).date()
|
||||
)
|
||||
)
|
||||
time_api_module.utc_now = lambda: datetime.now(timezone.utc)
|
||||
sys.modules["app.services.time_api"] = time_api_module
|
||||
|
||||
algorithms_module = types.ModuleType("app.algorithms.burst_location")
|
||||
algorithms_module.run_burst_location = lambda **kwargs: {}
|
||||
sys.modules["app.algorithms.burst_location"] = algorithms_module
|
||||
@@ -198,8 +216,8 @@ def test_run_burst_location_uses_single_timerange_with_burst_source_split(monkey
|
||||
assert any(call["element_type"] == "link" and call["field"] == "flow" for call in realtime_calls)
|
||||
assert any(call["element_type"] == "node" and call["field"] == "actual_demand" for call in realtime_calls)
|
||||
assert result["scada_window"] == {
|
||||
"burst_start": "2025-01-01T08:00:00",
|
||||
"burst_end": "2025-01-01T09:00:00",
|
||||
"burst_start": "2025-01-01T08:00:00+00:00",
|
||||
"burst_end": "2025-01-01T09:00:00+00:00",
|
||||
}
|
||||
|
||||
|
||||
@@ -230,6 +248,54 @@ def test_run_burst_location_requires_simulation_scheme_name(monkeypatch, tmp_pat
|
||||
)
|
||||
|
||||
|
||||
def test_build_observed_series_from_simulation_normalizes_result_ids(monkeypatch):
|
||||
module = _load_burst_location_module()
|
||||
query_calls = []
|
||||
|
||||
monkeypatch.setattr(
|
||||
module,
|
||||
"get_all_scada_info",
|
||||
lambda network: [
|
||||
{
|
||||
"type": "pressure",
|
||||
"associated_element_id": " 100026 ",
|
||||
"api_query_id": " pressure-query ",
|
||||
}
|
||||
],
|
||||
)
|
||||
|
||||
def fake_scheme_query(**kwargs):
|
||||
query_calls.append(kwargs)
|
||||
return {
|
||||
100026: [
|
||||
{"time": kwargs["start_time"], "value": 10.0},
|
||||
{"time": kwargs["end_time"], "value": 14.0},
|
||||
]
|
||||
}
|
||||
|
||||
monkeypatch.setattr(
|
||||
module.InternalQueries,
|
||||
"query_scheme_simulation_by_ids_timerange",
|
||||
staticmethod(fake_scheme_query),
|
||||
)
|
||||
|
||||
series, sample_count = module._build_observed_series_from_simulation(
|
||||
network="tjwater",
|
||||
sensor_ids=["100026"],
|
||||
start_dt=datetime(2025, 1, 1, 0, 0, 0, tzinfo=timezone.utc),
|
||||
end_dt=datetime(2025, 1, 1, 1, 0, 0, tzinfo=timezone.utc),
|
||||
data_type="pressure",
|
||||
series_name="burst_pressure",
|
||||
simulation_source="scheme",
|
||||
simulation_scheme_name="BurstSchemeA",
|
||||
simulation_scheme_type="burst_analysis",
|
||||
)
|
||||
|
||||
assert query_calls[0]["element_ids"] == ["100026"]
|
||||
assert sample_count == 2
|
||||
assert series["100026"] == pytest.approx(12.0)
|
||||
|
||||
|
||||
def test_run_burst_location_monitoring_uses_scada_for_burst_and_realtime_for_normal(
|
||||
monkeypatch, tmp_path
|
||||
):
|
||||
|
||||
Reference in New Issue
Block a user