"""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"]