Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion testing/baselines/tests.builtin-info/out
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
is_loaded = True
is_outdated = False
is_pinned = True
tracking_method = builtin
tracking_method = None
metadata (from version ""):
<empty metadata file>

50 changes: 15 additions & 35 deletions testing/test_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,18 @@
Manager,
_info_from_snapshot,
_is_directory_package,
_is_git_package,
_prepare_snapshot,
_resolve_git_version,
_snapshot_from_directory,
_snapshot_from_git_repo,
)
from zeekpkg.package import (
TRACKING_METHOD_BRANCH,
TRACKING_METHOD_BUILTIN,
TRACKING_METHOD_COMMIT,
TRACKING_METHOD_DIRECTORY,
TRACKING_METHOD_VERSION,
InstalledPackage,
Package,
PackageInfo,
PackageSnapshot,
PackageStatus,
TrackingMethod,
)


Expand Down Expand Up @@ -59,23 +54,23 @@ def repo(tmp_path: pathlib.Path) -> git.Repo:
def test_defaults_to_branch_when_no_tags(repo: git.Repo) -> None:
resolution = _resolve_git_version(repo, "")
assert isinstance(resolution, GitResolution)
assert resolution.tracking_method == TRACKING_METHOD_BRANCH
assert resolution.tracking_method == TrackingMethod.BRANCH
assert resolution.version == "main"


def test_defaults_to_latest_tag(repo: git.Repo) -> None:
repo.create_tag("v1.0.0")
repo.create_tag("v2.0.0")
resolution = _resolve_git_version(repo, "")
assert resolution.tracking_method == TRACKING_METHOD_VERSION
assert resolution.tracking_method == TrackingMethod.VERSION
assert resolution.version == "v2.0.0"


def test_explicit_version_tag(repo: git.Repo) -> None:
repo.create_tag("v1.0.0")
repo.create_tag("v2.0.0")
resolution = _resolve_git_version(repo, "v1.0.0")
assert resolution.tracking_method == TRACKING_METHOD_VERSION
assert resolution.tracking_method == TrackingMethod.VERSION
assert resolution.version == "v1.0.0"


Expand All @@ -85,14 +80,14 @@ def test_explicit_branch(repo: git.Repo) -> None:
repo.remotes.origin.fetch()
repo.git.checkout("feature")
resolution = _resolve_git_version(repo, "feature")
assert resolution.tracking_method == TRACKING_METHOD_BRANCH
assert resolution.tracking_method == TrackingMethod.BRANCH
assert resolution.version == "feature"


def test_explicit_commit_hash(repo: git.Repo) -> None:
hexsha = repo.head.object.hexsha
resolution = _resolve_git_version(repo, hexsha)
assert resolution.tracking_method == TRACKING_METHOD_COMMIT
assert resolution.tracking_method == TrackingMethod.COMMIT
assert resolution.current_hash == hexsha


Expand Down Expand Up @@ -228,21 +223,6 @@ def _make_installed(
manager.installed_pkgs[name] = InstalledPackage(pkg, status)


@pytest.mark.parametrize(
"method,expected",
[
(TRACKING_METHOD_VERSION, True),
(TRACKING_METHOD_BRANCH, True),
(TRACKING_METHOD_COMMIT, True),
(TRACKING_METHOD_BUILTIN, False),
(TRACKING_METHOD_DIRECTORY, False),
(None, False),
],
)
def test_is_git_package(method: str | None, expected: bool) -> None:
assert _is_git_package(PackageStatus(tracking_method=method)) is expected


def test_snapshot_from_directory(pkg_dir: pathlib.Path) -> None:
snapshot = _snapshot_from_directory(str(pkg_dir))
assert isinstance(snapshot, PackageSnapshot)
Expand Down Expand Up @@ -278,7 +258,7 @@ def test_prepare_snapshot_directory(
package = Package(git_url=str(pkg_dir), canonical=True)
snapshot = _prepare_snapshot(package, None, str(tmp_path / "dest"))
assert snapshot.version == "1.0.0"
assert snapshot.tracking_method == TRACKING_METHOD_DIRECTORY
assert snapshot.tracking_method == None
assert snapshot.current_hash is None
assert snapshot.is_outdated is False

Expand All @@ -298,7 +278,7 @@ def test_prepare_snapshot_git(repo: git.Repo, tmp_path: pathlib.Path) -> None:
str(tmp_path / "dest"),
existing_clone=repo,
)
assert snapshot.tracking_method == TRACKING_METHOD_BRANCH
assert snapshot.tracking_method == TrackingMethod.BRANCH
assert snapshot.current_hash is not None


Expand All @@ -307,15 +287,15 @@ def test_info_directory_backend(manager: Manager, pkg_dir: pathlib.Path) -> None
info = manager.info(str(pkg_dir))
assert info.invalid_reason == ""
assert info.metadata_version == "1.0.0"
assert info.version_type == TRACKING_METHOD_DIRECTORY
assert info.version_type == None


def test_install_directory_backend(manager: Manager, pkg_dir: pathlib.Path) -> None:
result = manager.install(str(pkg_dir))
assert result == ""
ipkg = manager.find_installed_package("mypkg")
assert ipkg is not None
assert ipkg.status.tracking_method == TRACKING_METHOD_DIRECTORY
assert ipkg.status.tracking_method == None
assert ipkg.status.current_version == "1.0.0"


Expand Down Expand Up @@ -348,13 +328,13 @@ def test_info_from_snapshot(repo: git.Repo) -> None:
status=None,
versions=["v1.0.0"],
default_branch="main",
version_type=TRACKING_METHOD_VERSION,
version_type=TrackingMethod.VERSION,
)
assert isinstance(info, PackageInfo)
assert info.metadata["description"] == "hello"
assert info.versions == ["v1.0.0"]
assert info.default_branch == "main"
assert info.version_type == TRACKING_METHOD_VERSION
assert info.version_type == TrackingMethod.VERSION
assert info.invalid_reason == ""


Expand All @@ -372,7 +352,7 @@ def test_info_installed_missing_metadata(manager: Manager) -> None:
_make_installed(
manager,
pkg_name,
tracking_method=TRACKING_METHOD_BRANCH,
tracking_method=TrackingMethod.BRANCH,
current_version="main",
)
info = manager.info(f"https://example.com/{pkg_name}", prefer_installed=True)
Expand All @@ -385,7 +365,7 @@ def test_refresh_skips_non_git_packages(manager: Manager) -> None:
_make_installed(
manager,
"mypkg",
tracking_method=TRACKING_METHOD_DIRECTORY,
tracking_method=None,
current_version="1.0.0",
)
# Should complete without raising.
Expand Down Expand Up @@ -484,7 +464,7 @@ def test_bundle_skips_non_git_existing_clone(
_make_installed(
manager,
"mypkg",
tracking_method=TRACKING_METHOD_DIRECTORY,
tracking_method=None,
current_version="1.0.0",
)
bundle_file = str(tmp_path / "out.tar.gz")
Expand Down
31 changes: 31 additions & 0 deletions testing/test_package.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""Unit tests for zeekpkg.package data structures."""

import pytest

from zeekpkg.package import PackageStatus, TrackingMethod


@pytest.mark.parametrize("value", [m.value for m in TrackingMethod])
def test_package_status_coerces_string_tracking_method(value: str) -> None:
# Manifest JSON deserialises tracking_method as a plain string; verify
# PackageStatus converts it to the enum.
status = PackageStatus(tracking_method=value)
assert status.tracking_method is TrackingMethod(value)


@pytest.mark.parametrize("value", ["builtin", "directory"])
def test_package_status_maps_legacy_non_git_methods_to_none(value: str) -> None:
# Non-Git packages have no tracking method; older manifests use string
# values for them that must round-trip to None.
status = PackageStatus(tracking_method=value)
assert status.tracking_method is None


def test_package_status_accepts_enum_tracking_method() -> None:
status = PackageStatus(tracking_method=TrackingMethod.BRANCH)
assert status.tracking_method is TrackingMethod.BRANCH


def test_package_status_rejects_invalid_tracking_method() -> None:
with pytest.raises(ValueError):
PackageStatus(tracking_method="bogus")
Loading
Loading