82 lines
2.6 KiB
Python
82 lines
2.6 KiB
Python
"""Tests for self-hosted merged YAML config loading."""
|
|
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from flow.core import paths as paths_module
|
|
from flow.core.config import load_config, load_manifest
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_roots(tmp_path, monkeypatch):
|
|
local_root = tmp_path / "local-flow"
|
|
dotfiles_root = tmp_path / "dotfiles" / "_shared" / "flow" / ".config" / "flow"
|
|
|
|
local_root.mkdir(parents=True)
|
|
dotfiles_root.mkdir(parents=True)
|
|
|
|
monkeypatch.setattr(paths_module, "CONFIG_DIR", local_root)
|
|
monkeypatch.setattr(paths_module, "DOTFILES_FLOW_CONFIG", dotfiles_root)
|
|
|
|
return {
|
|
"local": local_root,
|
|
"dotfiles": dotfiles_root,
|
|
}
|
|
|
|
|
|
def test_load_manifest_priority_dotfiles_first(mock_roots):
|
|
(mock_roots["local"] / "profiles.yaml").write_text("profiles:\n local: {os: linux}\n")
|
|
(mock_roots["dotfiles"] / "profiles.yaml").write_text("profiles:\n dotfiles: {os: macos}\n")
|
|
|
|
manifest = load_manifest()
|
|
assert "dotfiles" in manifest.get("profiles", {})
|
|
assert "local" not in manifest.get("profiles", {})
|
|
|
|
|
|
def test_load_manifest_fallback_to_local(mock_roots):
|
|
(mock_roots["local"] / "profiles.yaml").write_text("profiles:\n local: {os: linux}\n")
|
|
|
|
# Remove dotfiles yaml file so local takes over.
|
|
dot_yaml = mock_roots["dotfiles"] / "profiles.yaml"
|
|
if dot_yaml.exists():
|
|
dot_yaml.unlink()
|
|
|
|
manifest = load_manifest()
|
|
assert "local" in manifest.get("profiles", {})
|
|
|
|
|
|
def test_load_manifest_empty_when_none_exist(mock_roots):
|
|
manifest = load_manifest()
|
|
assert manifest == {}
|
|
|
|
|
|
def test_load_config_from_merged_yaml(mock_roots):
|
|
(mock_roots["dotfiles"] / "config.yaml").write_text(
|
|
"repository:\n"
|
|
" dotfiles-url: git@github.com:user/dotfiles.git\n"
|
|
"defaults:\n"
|
|
" container-registry: registry.example.com\n"
|
|
)
|
|
|
|
cfg = load_config()
|
|
assert cfg.dotfiles_url == "git@github.com:user/dotfiles.git"
|
|
assert cfg.container_registry == "registry.example.com"
|
|
|
|
|
|
def test_yaml_merge_is_alphabetical_last_writer_wins(mock_roots):
|
|
(mock_roots["local"] / "10-a.yaml").write_text("profiles:\n a: {os: linux}\n")
|
|
(mock_roots["local"] / "20-b.yaml").write_text("profiles:\n b: {os: linux}\n")
|
|
|
|
manifest = load_manifest(mock_roots["local"])
|
|
assert "b" in manifest.get("profiles", {})
|
|
assert "a" not in manifest.get("profiles", {})
|
|
|
|
|
|
def test_explicit_file_path_loads_single_yaml(tmp_path):
|
|
one_file = tmp_path / "single.yaml"
|
|
one_file.write_text("profiles:\n only: {os: linux}\n")
|
|
|
|
manifest = load_manifest(one_file)
|
|
assert "only" in manifest["profiles"]
|