70 lines
2.6 KiB
Python
70 lines
2.6 KiB
Python
from unittest.mock import patch
|
|
|
|
from app.homelab.openmeteo import (
|
|
RECOMMENDED_SYNC_DOMAINS,
|
|
RECOMMENDED_SYNC_VARIABLES,
|
|
SYNC_HINT,
|
|
_coverage_sufficient,
|
|
_field_coverage,
|
|
_hourly_start_index,
|
|
build_weather_dashboard,
|
|
)
|
|
|
|
|
|
def test_hourly_start_index_from_current():
|
|
times = ["2026-06-14T00:00", "2026-06-14T01:00", "2026-06-14T18:00", "2026-06-14T19:00"]
|
|
assert _hourly_start_index(times, "2026-06-14T18:15") == 2
|
|
|
|
|
|
def test_coverage_sufficient():
|
|
assert _coverage_sufficient({"current": ["temperature_2m"], "hourly": ["temperature_2m"]}) is False
|
|
assert _coverage_sufficient(
|
|
{
|
|
"current": ["temperature_2m", "weather_code", "wind_speed_10m"],
|
|
"hourly": ["temperature_2m", "precipitation_probability", "weather_code"],
|
|
}
|
|
) is True
|
|
|
|
|
|
def test_field_coverage_partial():
|
|
raw = {
|
|
"current": {"time": "2026-06-14T18:15", "temperature_2m": 20.6},
|
|
"hourly": {
|
|
"time": ["2026-06-14T18:00", "2026-06-14T19:00"],
|
|
"temperature_2m": [20.0, 19.5],
|
|
"precipitation": [0.0, 0.0],
|
|
},
|
|
}
|
|
coverage = _field_coverage(raw)
|
|
assert coverage["current"] == ["temperature_2m"]
|
|
assert "temperature_2m" in coverage["hourly"]
|
|
assert "precipitation" in coverage["hourly"]
|
|
assert "weather_code" not in coverage["hourly"]
|
|
|
|
|
|
def test_build_weather_dashboard_includes_sync_hint():
|
|
fake_weather = {
|
|
"ok": True,
|
|
"location": "Test",
|
|
"data_source": "local",
|
|
"local_field_coverage": {"current": ["temperature_2m"], "hourly": ["temperature_2m"]},
|
|
"field_coverage": {"current": ["temperature_2m"], "hourly": ["temperature_2m"]},
|
|
"sync_hint": SYNC_HINT,
|
|
"current": {"temperature_c": 10, "conditions": "неизвестно"},
|
|
"hourly": [],
|
|
}
|
|
with patch("app.homelab.openmeteo.OpenMeteoClient") as mock_cls:
|
|
client = mock_cls.return_value
|
|
client.fetch_current_and_hourly.return_value = fake_weather
|
|
client.rain_summary.return_value = "ok"
|
|
client.cache_status.return_value = {"source": "local", "has_data": True, "cached": True, "ttl_sec": 300}
|
|
client.location_name = "Test"
|
|
client.lat = 1.0
|
|
client.lon = 2.0
|
|
client.base_url = "http://local"
|
|
client.cache_ttl = 300
|
|
result = build_weather_dashboard()
|
|
assert result["sync_hint"]
|
|
assert result["recommended_sync"]["domains"] == RECOMMENDED_SYNC_DOMAINS
|
|
assert result["recommended_sync"]["variables"] == RECOMMENDED_SYNC_VARIABLES
|