2024-12-15 14:40:03 +01:00
|
|
|
import json
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
from akkudoktoreos.core.ems import get_ems
|
|
|
|
from akkudoktoreos.prediction.weatherimport import WeatherImport
|
|
|
|
from akkudoktoreos.utils.datetimeutil import compare_datetimes, to_datetime
|
|
|
|
|
|
|
|
DIR_TESTDATA = Path(__file__).absolute().parent.joinpath("testdata")
|
|
|
|
|
|
|
|
FILE_TESTDATA_WEATHERIMPORT_1_JSON = DIR_TESTDATA.joinpath("import_input_1.json")
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
2024-12-30 13:41:39 +01:00
|
|
|
def weather_provider(sample_import_1_json, config_eos):
|
2024-12-15 14:40:03 +01:00
|
|
|
"""Fixture to create a WeatherProvider instance."""
|
|
|
|
settings = {
|
|
|
|
"weather_provider": "WeatherImport",
|
|
|
|
"weatherimport_file_path": str(FILE_TESTDATA_WEATHERIMPORT_1_JSON),
|
|
|
|
"weatherimport_json": json.dumps(sample_import_1_json),
|
|
|
|
}
|
|
|
|
config_eos.merge_settings_from_dict(settings)
|
|
|
|
provider = WeatherImport()
|
|
|
|
assert provider.enabled() == True
|
|
|
|
return provider
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def sample_import_1_json():
|
|
|
|
"""Fixture that returns sample forecast data report."""
|
|
|
|
with open(FILE_TESTDATA_WEATHERIMPORT_1_JSON, "r") as f_res:
|
|
|
|
input_data = json.load(f_res)
|
|
|
|
return input_data
|
|
|
|
|
|
|
|
|
|
|
|
# ------------------------------------------------
|
|
|
|
# General forecast
|
|
|
|
# ------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
def test_singleton_instance(weather_provider):
|
|
|
|
"""Test that WeatherForecast behaves as a singleton."""
|
|
|
|
another_instance = WeatherImport()
|
|
|
|
assert weather_provider is another_instance
|
|
|
|
|
|
|
|
|
2024-12-30 13:41:39 +01:00
|
|
|
def test_invalid_provider(weather_provider, config_eos, monkeypatch):
|
2024-12-15 14:40:03 +01:00
|
|
|
"""Test requesting an unsupported weather_provider."""
|
|
|
|
settings = {
|
|
|
|
"weather_provider": "<invalid>",
|
|
|
|
"weatherimport_file_path": str(FILE_TESTDATA_WEATHERIMPORT_1_JSON),
|
|
|
|
}
|
|
|
|
config_eos.merge_settings_from_dict(settings)
|
|
|
|
assert weather_provider.enabled() == False
|
|
|
|
|
|
|
|
|
|
|
|
# ------------------------------------------------
|
|
|
|
# Import
|
|
|
|
# ------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"start_datetime, from_file",
|
|
|
|
[
|
|
|
|
("2024-11-10 00:00:00", True), # No DST in Germany
|
|
|
|
("2024-08-10 00:00:00", True), # DST in Germany
|
|
|
|
("2024-03-31 00:00:00", True), # DST change in Germany (23 hours/ day)
|
|
|
|
("2024-10-27 00:00:00", True), # DST change in Germany (25 hours/ day)
|
|
|
|
("2024-11-10 00:00:00", False), # No DST in Germany
|
|
|
|
("2024-08-10 00:00:00", False), # DST in Germany
|
|
|
|
("2024-03-31 00:00:00", False), # DST change in Germany (23 hours/ day)
|
|
|
|
("2024-10-27 00:00:00", False), # DST change in Germany (25 hours/ day)
|
|
|
|
],
|
|
|
|
)
|
2024-12-30 13:41:39 +01:00
|
|
|
def test_import(weather_provider, sample_import_1_json, start_datetime, from_file, config_eos):
|
2024-12-15 14:40:03 +01:00
|
|
|
"""Test fetching forecast from Import."""
|
2024-12-30 13:41:39 +01:00
|
|
|
ems_eos = get_ems()
|
2024-12-15 14:40:03 +01:00
|
|
|
ems_eos.set_start_datetime(to_datetime(start_datetime, in_timezone="Europe/Berlin"))
|
|
|
|
if from_file:
|
|
|
|
config_eos.weatherimport_json = None
|
|
|
|
assert config_eos.weatherimport_json is None
|
|
|
|
else:
|
|
|
|
config_eos.weatherimport_file_path = None
|
|
|
|
assert config_eos.weatherimport_file_path is None
|
|
|
|
weather_provider.clear()
|
|
|
|
|
|
|
|
# Call the method
|
|
|
|
weather_provider.update_data()
|
|
|
|
|
|
|
|
# Assert: Verify the result is as expected
|
|
|
|
assert weather_provider.start_datetime is not None
|
|
|
|
assert weather_provider.total_hours is not None
|
|
|
|
assert compare_datetimes(weather_provider.start_datetime, ems_eos.start_datetime).equal
|
|
|
|
values = sample_import_1_json["weather_temp_air"]
|
2024-12-29 18:42:49 +01:00
|
|
|
value_datetime_mapping = weather_provider.import_datetimes(ems_eos.start_datetime, len(values))
|
2024-12-15 14:40:03 +01:00
|
|
|
for i, mapping in enumerate(value_datetime_mapping):
|
|
|
|
assert i < len(weather_provider.records)
|
|
|
|
expected_datetime, expected_value_index = mapping
|
|
|
|
expected_value = values[expected_value_index]
|
|
|
|
result_datetime = weather_provider.records[i].date_time
|
|
|
|
result_value = weather_provider.records[i]["weather_temp_air"]
|
|
|
|
|
|
|
|
# print(f"{i}: Expected: {expected_datetime}:{expected_value}")
|
|
|
|
# print(f"{i}: Result: {result_datetime}:{result_value}")
|
|
|
|
assert compare_datetimes(result_datetime, expected_datetime).equal
|
|
|
|
assert result_value == expected_value
|