Port of main's guard into update_cmd_validation: the probe child sets sys.argv to the updater's contract before importing hermes_cli.main, so the startup dotenv load does not run op/bws/command helpers. Tests follow the validation module and the run_completion seam; the unused isolated_update_runtime fixture referenced retired names and goes.
67 lines
2.7 KiB
Python
67 lines
2.7 KiB
Python
"""Desktop launch prepares once, then stages and publishes the local pack."""
|
|
from argparse import Namespace
|
|
import subprocess
|
|
|
|
import pytest
|
|
|
|
from hermes_cli import main, main_desktop
|
|
from tests.hermes_cli.test_source_build import source_checkout, source_products, _events # noqa: F401
|
|
|
|
|
|
@pytest.fixture
|
|
def desktop_source(source_products, monkeypatch):
|
|
root, acquired = source_products
|
|
monkeypatch.setattr(main, "PROJECT_ROOT", root)
|
|
monkeypatch.setattr(main_desktop, "_desktop_launch_env", lambda args: ({}, []))
|
|
monkeypatch.setattr(main_desktop, "_register_linux_desktop_entry", lambda **kwargs: None)
|
|
return root, acquired
|
|
|
|
|
|
@pytest.mark.platforms("linux")
|
|
def test_desktop_build_only_prepares_once_and_keeps_fresh_launch_fast(desktop_source):
|
|
root, acquired = desktop_source
|
|
main_desktop.cmd_gui(Namespace(build_only=True))
|
|
app = root / "apps/desktop/release/linux-unpacked/hermes"
|
|
assert app.read_text() == "desktop"
|
|
assert [event["step"] for event in _events(root)] == ["deps", "icons", "desktop"]
|
|
assert acquired == ["npm"]
|
|
assert (root / "node_modules/ui-tui").exists()
|
|
assert (root / "node_modules/web").exists()
|
|
assert (root / "node_modules/apps-desktop").exists()
|
|
assert not (root / "node_modules/unrelated").exists()
|
|
main_desktop.cmd_gui(Namespace(build_only=True))
|
|
assert acquired == ["npm"]
|
|
assert len(_events(root)) == 3
|
|
|
|
|
|
@pytest.mark.platforms("linux")
|
|
def test_failed_pack_exits_without_launching_or_replacing_the_app(desktop_source):
|
|
root, acquired = desktop_source
|
|
app = root / "apps/desktop/release/linux-unpacked/hermes"
|
|
app.parent.mkdir(parents=True)
|
|
app.write_text("previous app")
|
|
(root / "fail-desktop").touch()
|
|
with pytest.raises(SystemExit) as error:
|
|
main_desktop.cmd_gui(Namespace(build_only=True))
|
|
assert error.value.code != 0
|
|
assert app.read_text() == "previous app"
|
|
assert acquired == ["npm"]
|
|
assert [event["step"] for event in _events(root)] == ["deps", "icons", "desktop"]
|
|
assert not list((root / "apps/desktop").glob(".staging-*"))
|
|
|
|
|
|
@pytest.mark.platforms("linux")
|
|
def test_skip_build_source_checks_artifacts_without_provisioning(desktop_source):
|
|
root, acquired = desktop_source
|
|
with pytest.raises(SystemExit):
|
|
main_desktop.cmd_gui(Namespace(source=True, skip_build=True, build_only=True))
|
|
assert acquired == []
|
|
dist = root / "apps/desktop/dist"
|
|
dist.mkdir()
|
|
(dist / "index.html").write_text("prepared renderer")
|
|
electron = root / "node_modules/electron"
|
|
electron.mkdir(parents=True)
|
|
(electron / "package.json").write_text('{}')
|
|
main_desktop.cmd_gui(Namespace(source=True, skip_build=True, build_only=True))
|
|
assert acquired == []
|