"""Tests for packages domain models.""" from pathlib import Path import pytest from flow.core.errors import ConfigError from flow.domain.packages.models import InstalledPackage, InstalledState, PackageDef def test_installed_state_roundtrip(): state = InstalledState(packages={ "neovim": InstalledPackage( name="neovim", version="0.10.4", type="binary", files=[Path("/home/x/.local/bin/nvim")], ), }) data = state.as_dict() restored = InstalledState.from_dict(data) assert "neovim" in restored.packages assert restored.packages["neovim"].version == "0.10.4" assert restored.packages["neovim"].files == [Path("/home/x/.local/bin/nvim")] def test_installed_state_empty(): state = InstalledState.from_dict({}) assert state.packages == {} def test_installed_state_version_mismatch(): with pytest.raises(ConfigError): InstalledState.from_dict({"version": 99, "packages": {}}) def test_installed_state_corrupt_missing_version_raises(): with pytest.raises(ConfigError, match="missing field 'version'"): InstalledState.from_dict({ "version": 1, "packages": {"fd": {"type": "pkg", "files": []}}, }) def test_installed_state_corrupt_missing_type_raises(): with pytest.raises(ConfigError, match="missing field 'type'"): InstalledState.from_dict({ "version": 1, "packages": {"fd": {"version": "1.0", "files": []}}, }) def test_installed_state_corrupt_missing_files_raises(): with pytest.raises(ConfigError, match="missing field 'files'"): InstalledState.from_dict({ "version": 1, "packages": {"fd": {"version": "1.0", "type": "pkg"}}, }) def test_package_def_fields(): pkg = PackageDef( name="fd", type="pkg", sources={"apt": "fd-find"}, source=None, version=None, asset_pattern=None, platform_map={}, extract_dir=None, install={}, post_install=None, ) assert pkg.name == "fd" assert pkg.type == "pkg"