mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2026-03-12 09:36:17 +00:00
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
|