feat: add all domain layers (dotfiles, packages, remote, containers)
- Dotfiles: models, module resolution, path resolution, link planning - Packages: models, catalog parsing, resolution, install/remove planning - Remote: target parsing, SSH command building - Containers: image refs, mount resolution, container specs All domain code is pure functions + frozen dataclasses. 88 tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
64
tests/test_domain_packages_planning.py
Normal file
64
tests/test_domain_packages_planning.py
Normal file
@@ -0,0 +1,64 @@
|
||||
"""Tests for package install/remove planning."""
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
from flow.domain.packages.models import (
|
||||
InstalledPackage,
|
||||
InstalledState,
|
||||
PackageDef,
|
||||
)
|
||||
from flow.domain.packages.planning import plan_install, plan_remove
|
||||
|
||||
|
||||
def _pkg(name, type="pkg", sources=None, source=None, version=None,
|
||||
asset_pattern=None, platform_map=None):
|
||||
return PackageDef(
|
||||
name=name, type=type, sources=sources or {},
|
||||
source=source, version=version, asset_pattern=asset_pattern,
|
||||
platform_map=platform_map or {}, extract_dir=None, install={},
|
||||
post_install=None, allow_sudo=False,
|
||||
)
|
||||
|
||||
|
||||
class TestPlanInstall:
|
||||
def test_new_pm_package(self):
|
||||
pkgs = [_pkg("fd", sources={"apt": "fd-find"})]
|
||||
plan = plan_install(pkgs, InstalledState(), "linux-x64", pm="apt")
|
||||
assert len(plan.install_ops) == 1
|
||||
assert plan.install_ops[0].method == "pm"
|
||||
assert plan.install_ops[0].source_name == "fd-find"
|
||||
assert plan.pm_update_needed is True
|
||||
|
||||
def test_skip_already_installed(self):
|
||||
pkgs = [_pkg("fd")]
|
||||
installed = InstalledState(packages={
|
||||
"fd": InstalledPackage(name="fd", version="1.0", type="pkg"),
|
||||
})
|
||||
plan = plan_install(pkgs, installed, "linux-x64", pm="apt")
|
||||
assert len(plan.install_ops) == 0
|
||||
|
||||
def test_binary_package(self):
|
||||
pkgs = [_pkg("nvim", type="binary", source="github:neovim/neovim",
|
||||
version="v0.10.4",
|
||||
platform_map={"linux-x64": "nvim-linux-x86_64.tar.gz"})]
|
||||
plan = plan_install(pkgs, InstalledState(), "linux-x64", pm="apt")
|
||||
assert len(plan.install_ops) == 1
|
||||
assert plan.install_ops[0].method == "binary"
|
||||
assert plan.install_ops[0].download_url is not None
|
||||
|
||||
|
||||
class TestPlanRemove:
|
||||
def test_remove_installed(self):
|
||||
installed = InstalledState(packages={
|
||||
"fd": InstalledPackage(
|
||||
name="fd", version="1.0", type="pkg",
|
||||
files=[Path("/usr/bin/fd")],
|
||||
),
|
||||
})
|
||||
plan = plan_remove(["fd"], installed)
|
||||
assert len(plan.remove_ops) == 1
|
||||
assert plan.remove_ops[0].name == "fd"
|
||||
|
||||
def test_remove_not_installed(self):
|
||||
plan = plan_remove(["missing"], InstalledState())
|
||||
assert len(plan.remove_ops) == 0
|
||||
Reference in New Issue
Block a user