"""Tests for flow.core.config.""" from pathlib import Path import pytest from flow.core.config import AppConfig, load_config, load_manifest def test_load_config_missing_path(tmp_path): cfg = load_config(tmp_path / "nonexistent") assert isinstance(cfg, AppConfig) assert cfg.dotfiles_url == "" assert cfg.container_registry == "registry.tomastm.com" def test_load_config_from_yaml(tmp_path): (tmp_path / "config.yaml").write_text( "repository:\n" " url: git@github.com:user/dots.git\n" " branch: dev\n" "paths:\n" " projects: ~/code\n" "defaults:\n" " container-registry: my.registry.com\n" " tmux-session: main\n" ) cfg = load_config(tmp_path) assert cfg.dotfiles_url == "git@github.com:user/dots.git" assert cfg.dotfiles_branch == "dev" assert cfg.projects_dir == "~/code" assert cfg.container_registry == "my.registry.com" assert cfg.tmux_session == "main" def test_load_config_parses_targets_shorthand(tmp_path): (tmp_path / "config.yaml").write_text( "targets:\n" " personal@orb: personal.orb\n" ) cfg = load_config(tmp_path) assert len(cfg.targets) == 1 assert cfg.targets[0].namespace == "personal" assert cfg.targets[0].platform == "orb" assert cfg.targets[0].host == "personal.orb" def test_load_config_parses_targets_dict(tmp_path): (tmp_path / "config.yaml").write_text( "targets:\n" " work@ec2:\n" " host: work.ec2.internal\n" " identity: ~/.ssh/id_work\n" ) cfg = load_config(tmp_path) assert len(cfg.targets) == 1 assert cfg.targets[0].host == "work.ec2.internal" assert cfg.targets[0].identity == "~/.ssh/id_work" def test_load_manifest_returns_dict(tmp_path): (tmp_path / "manifest.yaml").write_text( "packages:\n" " - name: fd\n" " type: pkg\n" ) data = load_manifest(tmp_path) assert isinstance(data, dict) assert "packages" in data def test_load_manifest_merges_files(tmp_path): (tmp_path / "01-packages.yaml").write_text("packages:\n - name: fd\n type: pkg\n") (tmp_path / "02-profiles.yaml").write_text("profiles:\n work:\n os: linux\n") data = load_manifest(tmp_path) assert "packages" in data assert "profiles" in data def test_load_config_merges_local_and_overlay(tmp_path): local = tmp_path / "local" overlay = tmp_path / "overlay" local.mkdir() overlay.mkdir() (local / "config.yaml").write_text( "repository:\n" " url: git@github.com:user/dots.git\n" "targets:\n" " personal@orb: personal.orb\n" ) (overlay / "config.yaml").write_text( "repository:\n" " branch: dev\n" "defaults:\n" " tmux-session: main\n" ) cfg = load_config(local, overlay) assert cfg.dotfiles_url == "git@github.com:user/dots.git" assert cfg.dotfiles_branch == "dev" assert cfg.tmux_session == "main" assert cfg.targets[0].host == "personal.orb" def test_load_config_parses_legacy_targets(tmp_path): (tmp_path / "01-targets.yaml").write_text( "targets:\n" " personal: orb personal.orb ~/.ssh/id_personal\n" ) (tmp_path / "02-targets.yaml").write_text( "targets:\n" " - namespace: work\n" " platform: ec2\n" " host: work.ec2.internal\n" " identity: ~/.ssh/id_work\n" ) cfg = load_config(tmp_path) assert len(cfg.targets) == 2 assert cfg.targets[0].platform == "orb" assert cfg.targets[0].identity == "~/.ssh/id_personal" assert cfg.targets[1].namespace == "work" def test_load_manifest_merges_local_and_overlay(tmp_path): local = tmp_path / "local" overlay = tmp_path / "overlay" local.mkdir() overlay.mkdir() (local / "manifest.yaml").write_text("profiles:\n local:\n os: linux\n") (overlay / "packages.yaml").write_text("packages:\n - name: fd\n type: pkg\n") data = load_manifest(local, overlay) assert "profiles" in data assert "packages" in data