"""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()