Files
flow/tests/test_domain_bootstrap_planning.py
Tomas Mirchev 78d4064853 fix: address all code review issues
1. _merge_config: track explicit fields instead of comparing to defaults
2. plan_install: let asset resolution errors propagate (fail loudly)
3. _install_binary/_install_appimage: use argv lists instead of shell strings
4. _find_module: narrow exception to OSError/YAMLError, raise ConfigError
5. _install_binary: use pkg.extract_dir to scope binary search
6. plan_install: raise FlowError when pkg type needs PM but none found
7. Frozen dataclasses: change mutable list fields to tuples throughout
8. Remove dead stream_shell method and unused Console import
9. Guard os.getuid() with hasattr for cross-platform safety
10. _parse_targets: raise ConfigError on malformed entries
11. Bootstrap modules: use shlex.quote on all interpolated values

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 06:27:31 +02:00

86 lines
3.0 KiB
Python

"""Tests for bootstrap planning."""
import pytest
from flow.core.errors import ConfigError
from flow.domain.bootstrap.models import BootstrapAction, Profile
from flow.domain.bootstrap.planning import parse_profile, plan_bootstrap
class TestParseProfile:
def test_basic(self):
raw = {
"os": "linux",
"hostname": "dev-box",
"shell": "zsh",
"packages": ["fd", "ripgrep"],
}
profile = parse_profile("work", raw)
assert profile.name == "work"
assert profile.os == "linux"
assert profile.hostname == "dev-box"
assert profile.shell == "zsh"
assert len(profile.packages) == 2
def test_defaults(self):
profile = parse_profile("minimal", {})
assert profile.os == "linux"
assert profile.hostname is None
assert profile.packages == ()
def test_ssh_keys(self):
raw = {"ssh-keys": [{"path": "~/.ssh/id_ed25519", "type": "ed25519"}]}
profile = parse_profile("test", raw)
assert len(profile.ssh_keys) == 1
class TestPlanBootstrap:
def test_basic_plan(self):
profile = Profile(
name="test", os="linux", arch=None,
hostname="my-host", locale="en_US.UTF-8",
shell="zsh", ssh_keys=[], runcmd=[],
packages=["fd"], env_required=[],
)
manifest = {"packages": [{"name": "fd", "type": "pkg"}]}
plan = plan_bootstrap(profile, manifest)
assert plan.profile == "test"
assert plan.total_steps > 0
phases = [a.phase for a in plan.actions]
assert "setup" in phases
assert "packages" in phases
assert "dotfiles" in phases
def test_missing_env_raises(self, monkeypatch):
monkeypatch.delenv("REQUIRED_VAR", raising=False)
profile = Profile(
name="test", os="linux", arch=None,
hostname=None, locale=None, shell=None,
ssh_keys=[], runcmd=[], packages=[],
env_required=["REQUIRED_VAR"],
)
with pytest.raises(ConfigError, match="REQUIRED_VAR"):
plan_bootstrap(profile, {})
def test_runcmd_produces_action(self):
profile = Profile(
name="test", os="linux", arch=None,
hostname=None, locale=None, shell=None,
ssh_keys=[], runcmd=["echo hello", "echo world"],
packages=[], env_required=[],
)
plan = plan_bootstrap(profile, {})
runcmd_actions = [a for a in plan.actions if "custom command" in a.description.lower()]
assert len(runcmd_actions) == 1
def test_ssh_keys_action(self):
profile = Profile(
name="test", os="linux", arch=None,
hostname=None, locale=None, shell=None,
ssh_keys=[{"path": "~/.ssh/id", "type": "ed25519"}],
runcmd=[], packages=[], env_required=[],
)
plan = plan_bootstrap(profile, {})
ssh_actions = [a for a in plan.actions if "SSH" in a.description]
assert len(ssh_actions) == 1