When getting daily forecast, the min temperature of the current day should be the min temperature of the coming night

This commit is contained in:
Jules 2023-12-29 20:59:32 +01:00
parent 15925baab7
commit fe0b3419ce
Signed by: jdejaegh
GPG key ID: 99D6D184CA66933A
4 changed files with 64 additions and 15 deletions

View file

@ -106,6 +106,8 @@ class IrmKmiWeather(CoordinatorEntity, WeatherEntity):
data: list[Forecast] = self.coordinator.data.get('daily_forecast') data: list[Forecast] = self.coordinator.data.get('daily_forecast')
if not isinstance(data, list): if not isinstance(data, list):
return None return None
if len(data) > 1 and data[0].get('native_templow') is None and not data[1].get('is_daytime'):
data[0]['native_templow'] = data[1]['native_templow']
return [f for f in data if f.get('is_daytime')] return [f for f in data if f.get('is_daytime')]
async def async_forecast_hourly(self) -> list[Forecast] | None: async def async_forecast_hourly(self) -> list[Forecast] | None:

View file

@ -14,6 +14,21 @@ from custom_components.irm_kmi.api import IrmKmiApiParametersError
from custom_components.irm_kmi.const import DOMAIN, CONF_STYLE, CONF_STYLE_STD, CONF_DARK_MODE from custom_components.irm_kmi.const import DOMAIN, CONF_STYLE, CONF_STYLE_STD, CONF_DARK_MODE
async def patched(url: str, params: dict | None = None) -> bytes:
if "cdn.knmi.nl" in url:
file_name = "tests/fixtures/clouds_nl.png"
elif "app.meteo.be/services/appv4/?s=getIncaImage" in url:
file_name = "tests/fixtures/clouds_be.png"
elif "getLocalizationLayerBE" in url:
file_name = "tests/fixtures/loc_layer_be_n.png"
elif "getLocalizationLayerNL" in url:
file_name = "tests/fixtures/loc_layer_nl.png"
else:
raise ValueError("Not a valid parameter for the mock")
with open(file_name, "rb") as file:
return file.read()
@pytest.fixture(autouse=True) @pytest.fixture(autouse=True)
def auto_enable_custom_integrations(enable_custom_integrations): def auto_enable_custom_integrations(enable_custom_integrations):
yield yield
@ -61,7 +76,6 @@ def mock_irm_kmi_api_out_benelux(request: pytest.FixtureRequest) -> Generator[No
fixture: str = "forecast_out_of_benelux.json" fixture: str = "forecast_out_of_benelux.json"
forecast = json.loads(load_fixture(fixture)) forecast = json.loads(load_fixture(fixture))
print(type(forecast))
with patch( with patch(
"custom_components.irm_kmi.coordinator.IrmKmiApiClient", autospec=True "custom_components.irm_kmi.coordinator.IrmKmiApiClient", autospec=True
) as irm_kmi_api_mock: ) as irm_kmi_api_mock:
@ -85,26 +99,27 @@ def mock_exception_irm_kmi_api(request: pytest.FixtureRequest) -> Generator[None
def mock_image_irm_kmi_api(request: pytest.FixtureRequest) -> Generator[None, MagicMock, None]: def mock_image_irm_kmi_api(request: pytest.FixtureRequest) -> Generator[None, MagicMock, None]:
"""Return a mocked IrmKmi api client.""" """Return a mocked IrmKmi api client."""
async def patched(url: str, params: dict | None = None) -> bytes: with patch(
if "cdn.knmi.nl" in url: "custom_components.irm_kmi.coordinator.IrmKmiApiClient", autospec=True
file_name = "tests/fixtures/clouds_nl.png" ) as irm_kmi_api_mock:
elif "app.meteo.be/services/appv4/?s=getIncaImage" in url: irm_kmi = irm_kmi_api_mock.return_value
file_name = "tests/fixtures/clouds_be.png" irm_kmi.get_image.side_effect = patched
elif "getLocalizationLayerBE" in url: yield irm_kmi
file_name = "tests/fixtures/loc_layer_be_n.png"
elif "getLocalizationLayerNL" in url:
file_name = "tests/fixtures/loc_layer_nl.png"
else:
raise ValueError("Not a valid parameter for the mock")
with open(file_name, "rb") as file:
return file.read() @pytest.fixture()
def mock_image_and_nl_forecast_irm_kmi_api(request: pytest.FixtureRequest) -> Generator[None, MagicMock, None]:
"""Return a mocked IrmKmi api client."""
fixture: str = "forecast_nl.json"
forecast = json.loads(load_fixture(fixture))
with patch( with patch(
"custom_components.irm_kmi.coordinator.IrmKmiApiClient", autospec=True "custom_components.irm_kmi.coordinator.IrmKmiApiClient", autospec=True
) as irm_kmi_api_mock: ) as irm_kmi_api_mock:
irm_kmi = irm_kmi_api_mock.return_value irm_kmi = irm_kmi_api_mock.return_value
irm_kmi.get_image.side_effect = patched irm_kmi.get_image.side_effect = patched
irm_kmi.get_forecasts_coord.return_value = forecast
yield irm_kmi yield irm_kmi

View file

@ -8,7 +8,6 @@ from freezegun import freeze_time
from homeassistant.components.weather import (ATTR_CONDITION_CLOUDY, from homeassistant.components.weather import (ATTR_CONDITION_CLOUDY,
ATTR_CONDITION_PARTLYCLOUDY, ATTR_CONDITION_PARTLYCLOUDY,
ATTR_CONDITION_RAINY, Forecast) ATTR_CONDITION_RAINY, Forecast)
from homeassistant.components.zone import Zone
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from PIL import Image, ImageDraw, ImageFont from PIL import Image, ImageDraw, ImageFont
from pytest_homeassistant_custom_component.common import load_fixture, MockConfigEntry from pytest_homeassistant_custom_component.common import load_fixture, MockConfigEntry

33
tests/test_weather.py Normal file
View file

@ -0,0 +1,33 @@
from datetime import datetime
from unittest.mock import AsyncMock
from freezegun import freeze_time
from homeassistant.core import HomeAssistant
from pytest_homeassistant_custom_component.common import MockConfigEntry
from custom_components.irm_kmi import IrmKmiCoordinator, IrmKmiWeather
@freeze_time(datetime.fromisoformat("2023-12-28T15:30:00+01:00"))
async def test_weather_nl(
hass: HomeAssistant,
mock_image_and_nl_forecast_irm_kmi_api: AsyncMock,
mock_config_entry: MockConfigEntry
) -> None:
hass.states.async_set(
"zone.home",
0,
{"latitude": 50.738681639, "longitude": 4.054077148},
)
coordinator = IrmKmiCoordinator(hass, mock_config_entry)
await coordinator.async_config_entry_first_refresh()
weather = IrmKmiWeather(coordinator, mock_config_entry)
result = await weather.async_forecast_daily()
assert isinstance(result, list)
assert len(result) == 7
# When getting daily forecast, the min temperature of the current day
# should be the min temperature of the coming night
assert result[0]['native_templow'] == 9