Files
hermes-agent/tests/scripts/test_write_install_stamp.py
2026-10-10 15:20:13 +02:00

108 lines
5.2 KiB
Python

"""The emitted stamp must preserve build identity and reach the runtime reader."""
import json
import os
from pathlib import Path
import subprocess
import sys
import pytest
@pytest.mark.parametrize("variant,distribution,mechanism,payload,tag", [
("", None, "self", "bootstrap", None),
("bootstrap", "docker", "external", "bootstrap", None),
("bundled", "desktop-app", "electron-updater", "bundled", "v0.18.0"),
("bundled", "desktop-app", "app-installer", "bundled", "v0.18.0"),
("bundled", "desktop-app", "microsoft-store", "bundled", "v0.18.0"),
("bundled", "desktop-app", "external", "bundled", "v0.18.0"),
("light", "desktop-app", "electron-updater", "light", "v0.18.0"),
("runtime", "apt-termux", "external", "runtime", "v0.18.0"),
])
def test_cli_stamp_roundtrip(tmp_path, monkeypatch, variant, distribution, mechanism, payload, tag):
out = tmp_path / "install-stamp.json"
script = Path(__file__).resolve().parents[2] / "scripts/write_install_stamp.py"
env = {**os.environ, "HERMES_DESKTOP_VARIANT": variant, "HERMES_PAYLOAD_TAG": "v0.18.0", "HERMES_BUILD_COMMIT": ""}
args = [sys.executable, str(script), "--output", str(out), "--commit", "d" * 40,
"--source", "ci", "--base-version", "0.18.0", "--distance", "0",
"--update-mechanism", mechanism]
if distribution:
args += ["--distribution", distribution]
result = subprocess.run(args, env=env, capture_output=True, text=True, timeout=30, check=False)
assert result.returncode == 0, result.stderr
data = json.loads(out.read_text(encoding="utf-8-sig"))
assert {key: data[key] for key in ("source", "distribution", "updateMechanism", "payload", "tag", "commit")} == {
"source": "ci", "distribution": distribution, "updateMechanism": mechanism,
"payload": payload, "tag": tag, "commit": "d" * 40}
assert data["baseVersion"] == data["displayVersion"] == "0.18.0"
from hermes_cli.version_info import _stamp_version_info
from hermes_cli.venv_sync import _is_sealed
monkeypatch.setenv("HERMES_INSTALL_ROOT", str(tmp_path))
if payload == "light":
with pytest.raises(RuntimeError, match="light"):
_stamp_version_info()
else:
info = _stamp_version_info()
assert info is not None and info.commit == "d" * 40
assert _is_sealed(tmp_path)
(tmp_path / ".git").mkdir()
assert not _is_sealed(tmp_path), "a stamped source checkout is not sealed"
@pytest.mark.parametrize("arguments", [[], ["--update-mechanism", "carrier-pigeon"]])
def test_missing_or_invalid_mechanism_cannot_emit_stamp(tmp_path, arguments):
from scripts.write_install_stamp import build_stamp
out = tmp_path / "install-stamp.json"
result = subprocess.run(
[sys.executable, str(Path(__file__).resolve().parents[2] / "scripts/write_install_stamp.py"),
"--output", str(out), "--commit", "a" * 40, *arguments],
capture_output=True, text=True, timeout=30,
check=False,
)
assert result.returncode != 0 and "--update-mechanism" in result.stderr
assert not out.exists()
with pytest.raises(SystemExit, match="invalid --update-mechanism"):
build_stamp(commit="a" * 40, update_mechanism=arguments[-1] if arguments else "")
@pytest.mark.parametrize("variant,tag,error", [
("bundled", "", "HERMES_PAYLOAD_TAG"), ("light", "", "HERMES_PAYLOAD_TAG"),
("chonky", "v0.18.0", "unknown HERMES_DESKTOP_VARIANT"),
])
def test_invalid_variant_cannot_emit_stamp(tmp_path, variant, tag, error):
out = tmp_path / "install-stamp.json"
result = subprocess.run(
[sys.executable, str(Path(__file__).resolve().parents[2] / "scripts/write_install_stamp.py"),
"--output", str(out), "--commit", "d" * 40, "--base-version", "0.18.0",
"--update-mechanism", "self"],
env={**os.environ, "HERMES_DESKTOP_VARIANT": variant, "HERMES_PAYLOAD_TAG": tag, "HERMES_BUILD_COMMIT": ""},
capture_output=True, text=True, timeout=30, check=False)
assert result.returncode != 0 and error in result.stderr
assert not out.exists()
def test_packaged_identity_never_falls_back_to_project_metadata(tmp_path, monkeypatch):
from scripts import write_install_stamp
from hermes_cli.version_info import _stamp_version_info
(tmp_path / "hermes_cli").mkdir()
(tmp_path / "hermes_cli" / "_version.py").write_text('__version__ = "9.9.9"\n', encoding="utf-8")
(tmp_path / "pyproject.toml").write_text('[project]\nversion = "8.8.8"\n', encoding="utf-8")
monkeypatch.setattr(write_install_stamp, "_REPO_ROOT", tmp_path)
monkeypatch.setenv("HERMES_INSTALL_ROOT", str(tmp_path))
# No reachable release (a tagless docker build): the admitted commit is the whole identity.
write_install_stamp.write_stamp(
tmp_path / "install-stamp.json", update_mechanism="external", commit="d" * 40, source="ci", dirty=False,
)
info = _stamp_version_info()
assert info is not None
assert (info.base_version, info.derived_version, info.commit) == ("unknown", "git.ddddddd", "d" * 40)
stamp = write_install_stamp.build_stamp(
update_mechanism="external", commit="d" * 40, source="ci",
base_version="1.2.3", distance=0,
)
assert stamp["baseVersion"] == stamp["displayVersion"] == "1.2.3"