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