Files
aiturk-hermes-ide/tests/hermes_cli/test_update_zip_release_preserve.py
T

57 lines
2.2 KiB
Python

"""#70337/#87331: the ZIP swap must preserve apps/desktop/release/.
The GitHub source ZIP carries only source; the BUILT desktop app
(release/win-unpacked/Hermes.exe) exists only in the live tree. Swapping
`apps` without grafting the live release dir deletes the desktop build.
"""
from __future__ import annotations
import os
import shutil
from pathlib import Path
def test_staged_apps_swap_preserves_live_release_dir(tmp_path, monkeypatch):
from hermes_cli import main as hermes_main
from hermes_cli.update_cmd import (
_commit_staged_replacements,
_stage_replacement,
)
# live tree: apps/desktop/release/win-unpacked/Hermes.exe + old source
root = tmp_path / "install"
live_apps = root / "apps" / "desktop"
(live_apps / "release" / "win-unpacked").mkdir(parents=True)
(live_apps / "release" / "win-unpacked" / "Hermes.exe").write_bytes(b"MZbuilt")
(live_apps / "electron").mkdir()
(live_apps / "electron" / "main.ts").write_text("old source")
# extracted ZIP: new source, NO release dir (GitHub source archive shape)
extracted = tmp_path / "extracted"
zip_apps = extracted / "apps" / "desktop"
(zip_apps / "electron").mkdir(parents=True)
(zip_apps / "electron" / "main.ts").write_text("new source")
monkeypatch.setattr(hermes_main, "PROJECT_ROOT", root)
# Reproduce the _update_via_zip staging loop for the `apps` entry,
# including the release-dir graft.
src = str(extracted / "apps")
dst = str(root / "apps")
staged_path = _stage_replacement(src, dst)
live_release = os.path.join(dst, "desktop", "release")
staged_release = os.path.join(staged_path, "desktop", "release")
if os.path.isdir(live_release) and not os.path.exists(staged_release):
os.makedirs(os.path.dirname(staged_release), exist_ok=True)
shutil.copytree(live_release, staged_release)
_commit_staged_replacements([(staged_path, dst)])
# New source landed AND the built desktop app survived.
assert (root / "apps" / "desktop" / "electron" / "main.ts").read_text() == (
"new source"
)
exe = root / "apps" / "desktop" / "release" / "win-unpacked" / "Hermes.exe"
assert exe.exists() and exe.read_bytes() == b"MZbuilt"