mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2026-03-08 23:56:18 +00:00
Some checks failed
Bump Version / Bump Version Workflow (push) Has been cancelled
docker-build / platform-excludes (push) Has been cancelled
pre-commit / pre-commit (push) Has been cancelled
Run Pytest on Pull Request / test (push) Has been cancelled
docker-build / build (push) Has been cancelled
docker-build / merge (push) Has been cancelled
Close stale pull requests/issues / Find Stale issues and PRs (push) Has been cancelled
Validate solution prediction data before processing. If required prediction data is missing, the prediction is skipped instead of raising an exception. Introduce a new configuration file saving policy to improve loading robustness: - Exclude computed fields - Exclude fields set to their default values - Exclude fields with value None - Use field aliases - Recursively remove empty dictionaries and lists - Ensure general.version is always present and correctly set When loading older configuration files, computed fields are now stripped before migration. This further improves backward compatibility and loading robustness. Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
import json
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
|
|
from akkudoktoreos.config.config import ConfigEOS, GeneralSettings
|
|
|
|
|
|
class TestConfigEOSToConfigFile:
|
|
|
|
def test_to_config_file_writes_file(self, config_eos):
|
|
config_path = config_eos.general.config_file_path
|
|
|
|
# Remove file to test writing
|
|
config_path.unlink(missing_ok=True)
|
|
|
|
config_eos.to_config_file()
|
|
|
|
assert config_path.exists()
|
|
assert config_path.read_text().strip().startswith("{")
|
|
|
|
def test_to_config_file_excludes_computed_fields(self, config_eos):
|
|
config_path = config_eos.general.config_file_path
|
|
|
|
config_eos.to_config_file()
|
|
data = json.loads(config_path.read_text())
|
|
|
|
assert "timezone" not in data["general"]
|
|
assert "data_output_path" not in data["general"]
|
|
assert "config_folder_path" not in data["general"]
|
|
assert "config_file_path" not in data["general"]
|
|
|
|
def test_to_config_file_excludes_defaults(self, config_eos):
|
|
"""Ensure fields with default values are excluded when saving config."""
|
|
|
|
# Pick fields that have defaults
|
|
default_latitude = GeneralSettings.model_fields["latitude"].default
|
|
default_longitude = GeneralSettings.model_fields["longitude"].default
|
|
|
|
# Ensure fields are at default values
|
|
config_eos.general.latitude = default_latitude
|
|
config_eos.general.longitude = default_longitude
|
|
|
|
# Save the config using the correct path managed by config_eos
|
|
config_eos.to_config_file()
|
|
|
|
# Read back JSON from the correct path
|
|
config_file_path = config_eos.general.config_file_path
|
|
content = json.loads(config_file_path.read_text(encoding="utf-8"))
|
|
|
|
# Default fields should not appear
|
|
assert "latitude" not in content["general"]
|
|
assert "longitude" not in content["general"]
|
|
|
|
# Non-default value should appear
|
|
config_eos.general.latitude = 48.0
|
|
config_eos.to_config_file()
|
|
content = json.loads(config_file_path.read_text(encoding="utf-8"))
|
|
assert content["general"]["latitude"] == 48.0
|
|
|
|
def test_to_config_file_excludes_none_fields(self, config_eos):
|
|
config_eos.general.latitude = None
|
|
|
|
config_path = config_eos.general.config_file_path
|
|
config_eos.to_config_file()
|
|
|
|
data = json.loads(config_path.read_text())
|
|
|
|
assert "latitude" not in data["general"]
|
|
|
|
def test_to_config_file_includes_version(tmp_path, config_eos):
|
|
"""Ensure general.version is always included."""
|
|
# Save config
|
|
config_eos.to_config_file()
|
|
|
|
# Read back JSON
|
|
config_file_path = config_eos.general.config_file_path
|
|
content = json.loads(config_file_path.read_text(encoding="utf-8"))
|
|
|
|
# Assert 'version' is included even if default
|
|
assert content["general"]["version"] == config_eos.general.version
|
|
|
|
def test_to_config_file_roundtrip(self, config_eos):
|
|
config_eos.merge_settings_from_dict(
|
|
{
|
|
"general": {"latitude": 48.0},
|
|
"server": {"port": 9000},
|
|
}
|
|
)
|
|
|
|
config_path = config_eos.general.config_file_path
|
|
config_eos.to_config_file()
|
|
|
|
raw_data = json.loads(config_path.read_text())
|
|
reloaded = ConfigEOS.model_validate(raw_data)
|
|
|
|
assert reloaded.general.latitude == 48.0
|
|
assert reloaded.server.port == 9000
|