mirror of
https://github.com/Akkudoktor-EOS/EOS.git
synced 2025-04-19 08:55:15 +00:00
Add documentation that covers: - configuration - prediction Add Python scripts that support automatic documentation generation for configuration data defined with pydantic. Adapt EOS configuration to provide more methods for REST API and automatic documentation generation. Adapt REST API to allow for EOS configuration file load and save. Sort REST API on generation of openapi markdown for docs. Move logutil to core/logging to allow configuration of logging by standard config. Make Akkudoktor predictions always start extraction of prediction data at start of day. Previously extraction started at actual hour. This is to support the code that assumes prediction data to start at start of day. Signed-off-by: Bobby Noelte <b0661n0e17e@gmail.com>
128 lines
4.8 KiB
Python
128 lines
4.8 KiB
Python
import tempfile
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
|
|
from akkudoktoreos.config.config import ConfigEOS
|
|
from akkudoktoreos.core.logging import get_logger
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
# overwrite config_mixin fixture from conftest
|
|
@pytest.fixture(autouse=True)
|
|
def config_mixin():
|
|
pass
|
|
|
|
|
|
def test_fixture_new_config_file(config_default_dirs):
|
|
"""Assure fixture stash_config_file is working."""
|
|
config_default_dir_user, config_default_dir_cwd, _, _ = config_default_dirs
|
|
|
|
config_file_path_user = config_default_dir_user.joinpath(ConfigEOS.CONFIG_FILE_NAME)
|
|
config_file_path_cwd = config_default_dir_cwd.joinpath(ConfigEOS.CONFIG_FILE_NAME)
|
|
|
|
assert not config_file_path_user.exists()
|
|
assert not config_file_path_cwd.exists()
|
|
|
|
|
|
def test_config_constants(config_eos):
|
|
"""Test config constants are the way expected by the tests."""
|
|
assert config_eos.APP_NAME == "net.akkudoktor.eos"
|
|
assert config_eos.APP_AUTHOR == "akkudoktor"
|
|
assert config_eos.EOS_DIR == "EOS_DIR"
|
|
assert config_eos.ENCODING == "UTF-8"
|
|
assert config_eos.CONFIG_FILE_NAME == "EOS.config.json"
|
|
|
|
|
|
def test_computed_paths(config_eos):
|
|
"""Test computed paths for output and cache."""
|
|
config_eos.merge_settings_from_dict(
|
|
{
|
|
"data_folder_path": "/base/data",
|
|
"data_output_subpath": "output",
|
|
"data_cache_subpath": "cache",
|
|
}
|
|
)
|
|
assert config_eos.data_output_path == Path("/base/data/output")
|
|
assert config_eos.data_cache_path == Path("/base/data/cache")
|
|
# reset settings so the config_eos fixture can verify the default paths
|
|
config_eos.reset_settings()
|
|
|
|
|
|
def test_singleton_behavior(config_eos, config_default_dirs):
|
|
"""Test that ConfigEOS behaves as a singleton."""
|
|
initial_cfg_file = config_eos.config_file_path
|
|
with patch(
|
|
"akkudoktoreos.config.config.user_config_dir", return_value=str(config_default_dirs[0])
|
|
):
|
|
instance1 = ConfigEOS()
|
|
instance2 = ConfigEOS()
|
|
assert instance1 is config_eos
|
|
assert instance1 is instance2
|
|
assert instance1.config_file_path == initial_cfg_file
|
|
|
|
|
|
def test_default_config_path(config_eos, config_default_dirs):
|
|
"""Test that the default config file path is computed correctly."""
|
|
_, _, config_default_dir_default, _ = config_default_dirs
|
|
|
|
expected_path = config_default_dir_default.joinpath("default.config.json")
|
|
assert config_eos.config_default_file_path == expected_path
|
|
assert config_eos.config_default_file_path.is_file()
|
|
|
|
|
|
@patch("akkudoktoreos.config.config.user_config_dir")
|
|
def test_get_config_file_path(user_config_dir_patch, config_eos, config_default_dirs, monkeypatch):
|
|
"""Test that _get_config_file_path identifies the correct config file."""
|
|
config_default_dir_user, _, _, _ = config_default_dirs
|
|
user_config_dir_patch.return_value = str(config_default_dir_user)
|
|
|
|
def cfg_file(dir: Path) -> Path:
|
|
return dir.joinpath(ConfigEOS.CONFIG_FILE_NAME)
|
|
|
|
# Config newly created from fixture with fresh user config directory
|
|
assert config_eos._get_config_file_path() == (cfg_file(config_default_dir_user), True)
|
|
cfg_file(config_default_dir_user).unlink()
|
|
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
temp_dir_path = Path(temp_dir)
|
|
monkeypatch.setenv("EOS_DIR", str(temp_dir_path))
|
|
assert config_eos._get_config_file_path() == (cfg_file(temp_dir_path), False)
|
|
|
|
monkeypatch.setenv("EOS_CONFIG_DIR", "config")
|
|
assert config_eos._get_config_file_path() == (
|
|
cfg_file(temp_dir_path / "config"),
|
|
False,
|
|
)
|
|
|
|
monkeypatch.setenv("EOS_CONFIG_DIR", str(temp_dir_path / "config2"))
|
|
assert config_eos._get_config_file_path() == (
|
|
cfg_file(temp_dir_path / "config2"),
|
|
False,
|
|
)
|
|
|
|
monkeypatch.delenv("EOS_DIR")
|
|
monkeypatch.setenv("EOS_CONFIG_DIR", "config3")
|
|
assert config_eos._get_config_file_path() == (cfg_file(config_default_dir_user), False)
|
|
|
|
monkeypatch.setenv("EOS_CONFIG_DIR", str(temp_dir_path / "config3"))
|
|
assert config_eos._get_config_file_path() == (
|
|
cfg_file(temp_dir_path / "config3"),
|
|
False,
|
|
)
|
|
|
|
|
|
def test_config_copy(config_eos, monkeypatch):
|
|
"""Test if the config is copied to the provided path."""
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
temp_folder_path = Path(temp_dir)
|
|
temp_config_file_path = temp_folder_path.joinpath(config_eos.CONFIG_FILE_NAME).resolve()
|
|
monkeypatch.setenv(config_eos.EOS_DIR, str(temp_folder_path))
|
|
assert not temp_config_file_path.exists()
|
|
with patch("akkudoktoreos.config.config.user_config_dir", return_value=temp_dir):
|
|
assert config_eos._get_config_file_path() == (temp_config_file_path, False)
|
|
config_eos.from_config_file()
|
|
assert temp_config_file_path.exists()
|