2024-12-15 14:40:03 +01:00
|
|
|
import pytest
|
|
|
|
from pydantic import ValidationError
|
|
|
|
|
|
|
|
from akkudoktoreos.prediction.elecpriceakkudoktor import ElecPriceAkkudoktor
|
|
|
|
from akkudoktoreos.prediction.elecpriceimport import ElecPriceImport
|
|
|
|
from akkudoktoreos.prediction.loadakkudoktor import LoadAkkudoktor
|
|
|
|
from akkudoktoreos.prediction.loadimport import LoadImport
|
|
|
|
from akkudoktoreos.prediction.prediction import (
|
|
|
|
Prediction,
|
|
|
|
PredictionCommonSettings,
|
|
|
|
get_prediction,
|
|
|
|
)
|
|
|
|
from akkudoktoreos.prediction.pvforecastakkudoktor import PVForecastAkkudoktor
|
|
|
|
from akkudoktoreos.prediction.pvforecastimport import PVForecastImport
|
|
|
|
from akkudoktoreos.prediction.weatherbrightsky import WeatherBrightSky
|
|
|
|
from akkudoktoreos.prediction.weatherclearoutside import WeatherClearOutside
|
|
|
|
from akkudoktoreos.prediction.weatherimport import WeatherImport
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def prediction():
|
|
|
|
"""All EOS predictions."""
|
|
|
|
return get_prediction()
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def forecast_providers():
|
|
|
|
"""Fixture for singleton forecast provider instances."""
|
|
|
|
return [
|
|
|
|
ElecPriceAkkudoktor(),
|
|
|
|
ElecPriceImport(),
|
|
|
|
LoadAkkudoktor(),
|
|
|
|
LoadImport(),
|
|
|
|
PVForecastAkkudoktor(),
|
|
|
|
PVForecastImport(),
|
|
|
|
WeatherBrightSky(),
|
|
|
|
WeatherClearOutside(),
|
|
|
|
WeatherImport(),
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"field_name, invalid_value, expected_error",
|
|
|
|
[
|
2025-01-18 14:26:34 +01:00
|
|
|
("hours", -1, "Input should be greater than or equal to 0"),
|
|
|
|
("historic_hours", -5, "Input should be greater than or equal to 0"),
|
2024-12-15 14:40:03 +01:00
|
|
|
],
|
|
|
|
)
|
2025-01-20 22:58:59 +01:00
|
|
|
def test_prediction_common_settings_invalid(field_name, invalid_value, expected_error, config_eos):
|
2024-12-15 14:40:03 +01:00
|
|
|
"""Test invalid settings for PredictionCommonSettings."""
|
|
|
|
valid_data = {
|
2025-01-18 14:26:34 +01:00
|
|
|
"hours": 48,
|
|
|
|
"historic_hours": 24,
|
2024-12-15 14:40:03 +01:00
|
|
|
}
|
2025-01-18 14:26:34 +01:00
|
|
|
assert PredictionCommonSettings(**valid_data) is not None
|
2024-12-15 14:40:03 +01:00
|
|
|
valid_data[field_name] = invalid_value
|
|
|
|
|
|
|
|
with pytest.raises(ValidationError, match=expected_error):
|
|
|
|
PredictionCommonSettings(**valid_data)
|
|
|
|
|
|
|
|
|
|
|
|
def test_initialization(prediction, forecast_providers):
|
|
|
|
"""Test that Prediction is initialized with the correct providers in sequence."""
|
|
|
|
assert isinstance(prediction, Prediction)
|
|
|
|
assert prediction.providers == forecast_providers
|
|
|
|
|
|
|
|
|
|
|
|
def test_provider_sequence(prediction):
|
|
|
|
"""Test the provider sequence is maintained in the Prediction instance."""
|
|
|
|
assert isinstance(prediction.providers[0], ElecPriceAkkudoktor)
|
|
|
|
assert isinstance(prediction.providers[1], ElecPriceImport)
|
|
|
|
assert isinstance(prediction.providers[2], LoadAkkudoktor)
|
|
|
|
assert isinstance(prediction.providers[3], LoadImport)
|
|
|
|
assert isinstance(prediction.providers[4], PVForecastAkkudoktor)
|
|
|
|
assert isinstance(prediction.providers[5], PVForecastImport)
|
|
|
|
assert isinstance(prediction.providers[6], WeatherBrightSky)
|
|
|
|
assert isinstance(prediction.providers[7], WeatherClearOutside)
|
|
|
|
assert isinstance(prediction.providers[8], WeatherImport)
|
|
|
|
|
|
|
|
|
|
|
|
def test_provider_by_id(prediction, forecast_providers):
|
|
|
|
"""Test that provider_by_id method returns the correct provider."""
|
|
|
|
for provider in forecast_providers:
|
|
|
|
assert prediction.provider_by_id(provider.provider_id()) == provider
|
|
|
|
|
|
|
|
|
|
|
|
def test_prediction_repr(prediction):
|
|
|
|
"""Test that the Prediction instance's representation is correct."""
|
|
|
|
result = repr(prediction)
|
|
|
|
assert "Prediction([" in result
|
|
|
|
assert "ElecPriceAkkudoktor" in result
|
|
|
|
assert "ElecPriceImport" in result
|
|
|
|
assert "LoadAkkudoktor" in result
|
|
|
|
assert "LoadImport" in result
|
|
|
|
assert "PVForecastAkkudoktor" in result
|
|
|
|
assert "PVForecastImport" in result
|
|
|
|
assert "WeatherBrightSky" in result
|
|
|
|
assert "WeatherClearOutside" in result
|
|
|
|
assert "WeatherImport" in result
|
|
|
|
|
|
|
|
|
|
|
|
def test_empty_providers(prediction, forecast_providers):
|
|
|
|
"""Test behavior when Prediction does not have providers."""
|
|
|
|
# Clear all prediction providers from prediction
|
|
|
|
providers_bkup = prediction.providers.copy()
|
|
|
|
prediction.providers.clear()
|
|
|
|
assert prediction.providers == []
|
|
|
|
prediction.update_data() # Should not raise an error even with no providers
|
|
|
|
|
|
|
|
# Cleanup after Test
|
|
|
|
prediction.providers = providers_bkup
|