117 lines
3.6 KiB
Python
117 lines
3.6 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
import time
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
MODULE_PATH = Path(__file__).parents[1] / "scripts" / "present.py"
|
|
SPEC = importlib.util.spec_from_file_location("artifact_presenter_integration", MODULE_PATH)
|
|
assert SPEC and SPEC.loader
|
|
MODULE = importlib.util.module_from_spec(SPEC)
|
|
sys.modules[SPEC.name] = MODULE
|
|
SPEC.loader.exec_module(MODULE)
|
|
|
|
|
|
@unittest.skipUnless(
|
|
os.environ.get("HERDR_INTEGRATION_TESTS") == "1",
|
|
"set HERDR_INTEGRATION_TESTS=1 inside a Herdr pane",
|
|
)
|
|
class ArtifactPresenterIntegrationTests(unittest.TestCase):
|
|
def wait_for_mcat(self, herdr: str, pane_id: str, artifact: Path) -> None:
|
|
for _attempt in range(100):
|
|
state = MODULE.run_json(
|
|
herdr,
|
|
["pane", "process-info", "--pane", pane_id],
|
|
subprocess.run,
|
|
)
|
|
processes = state["result"]["process_info"]["foreground_processes"]
|
|
if any(
|
|
process.get("name") == "mcat"
|
|
and str(artifact) in process.get("argv", [])
|
|
for process in processes
|
|
):
|
|
return
|
|
time.sleep(0.05)
|
|
self.fail(f"mcat did not open {artifact}")
|
|
|
|
def test_replaces_active_mcat_in_real_herdr_pane(self) -> None:
|
|
herdr = shutil.which("herdr")
|
|
mcat = shutil.which("mcat")
|
|
source_pane = os.environ.get("HERDR_PANE_ID")
|
|
if not all((herdr, mcat, source_pane)):
|
|
self.skipTest("Herdr, mcat, and HERDR_PANE_ID are required")
|
|
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
first = root / "first.md"
|
|
second = root / "second.md"
|
|
first.write_text(
|
|
"# First artifact\n" + ("first viewer line " * 20 + "\n") * 1_000,
|
|
encoding="utf-8",
|
|
)
|
|
second.write_text(
|
|
"# Second artifact\n" + ("second viewer line " * 20 + "\n") * 1_000,
|
|
encoding="utf-8",
|
|
)
|
|
|
|
split = MODULE.run_json(
|
|
herdr,
|
|
[
|
|
"pane",
|
|
"split",
|
|
"--pane",
|
|
source_pane,
|
|
"--direction",
|
|
"right",
|
|
"--cwd",
|
|
directory,
|
|
"--env",
|
|
"PAGER=less",
|
|
"--no-focus",
|
|
],
|
|
subprocess.run,
|
|
)
|
|
pane_id = MODULE.created_pane_id(split)
|
|
try:
|
|
MODULE.run_mcat(
|
|
herdr,
|
|
mcat,
|
|
pane_id,
|
|
first,
|
|
subprocess.run,
|
|
)
|
|
self.wait_for_mcat(herdr, pane_id, first)
|
|
|
|
MODULE.run_mcat(
|
|
herdr,
|
|
mcat,
|
|
pane_id,
|
|
second,
|
|
subprocess.run,
|
|
reused=True,
|
|
)
|
|
self.wait_for_mcat(herdr, pane_id, second)
|
|
finally:
|
|
subprocess.run(
|
|
[herdr, "pane", "send-keys", pane_id, "q"],
|
|
check=False,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
subprocess.run(
|
|
[herdr, "pane", "close", pane_id],
|
|
check=False,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|