Release / release (push) Successful in 59s
Fresh installs shipped a config template with no store_path key while collector.py demanded one via get_store_path() — every first collect crashed with KeyError 'store_path'. Resolve to the packaged default (/var/lib/fenris/observations.db) when absent, document the key in the template, and cover the fresh-install path with regression tests. Bump to 0.3.2.
57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
"""Store path resolution from config — regression coverage for issue #53.
|
|
|
|
A fresh install ships a placeholder-commented config whose only required
|
|
key is the device selector. The collector must not crash with
|
|
KeyError 'store_path' when the key is absent.
|
|
"""
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
|
|
|
|
from fenris.store import DEFAULT_STORE_PATH, get_store_path
|
|
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parent.parent
|
|
TEMPLATE = REPO_ROOT / "packaging" / "fenris.conf"
|
|
|
|
|
|
def _parse_like_load_config(text: str) -> dict:
|
|
"""Mirror collect.load_config()'s key=value parsing rules."""
|
|
config = {}
|
|
for line in text.splitlines():
|
|
line = line.strip()
|
|
if not line or line.startswith("#"):
|
|
continue
|
|
if "=" in line:
|
|
key, value = line.split("=", 1)
|
|
config[key.strip()] = value.strip()
|
|
return config
|
|
|
|
|
|
def test_missing_store_path_falls_back_to_default():
|
|
"""Config with only the device selector resolves to the packaged default."""
|
|
assert get_store_path({"device": "/dev/nvme0n1"}) == DEFAULT_STORE_PATH
|
|
|
|
|
|
def test_explicit_store_path_wins():
|
|
"""An explicit store_path override is honored."""
|
|
assert get_store_path({"store_path": "/tmp/other.db"}) == Path("/tmp/other.db")
|
|
|
|
|
|
def test_packaged_template_yields_collectable_config():
|
|
"""The packaged template, once a device is set, must be collector-ready.
|
|
|
|
Reproduces the fresh-install path: parse packaging/fenris.conf the way
|
|
collect.load_config() does, add the device selector, then resolve the
|
|
store. Issue #53 made this raise KeyError.
|
|
"""
|
|
config = _parse_like_load_config(TEMPLATE.read_text())
|
|
config["device"] = "/dev/nvme0n1"
|
|
assert get_store_path(config) == DEFAULT_STORE_PATH
|
|
|
|
|
|
def test_template_documents_store_path():
|
|
"""The template must mention store_path so admins know it is overridable."""
|
|
assert "store_path" in TEMPLATE.read_text()
|