Files
hermes-agent/tests/hermes_cli/test_clipboard_text_write.py
T
ethernet 30da5d0a89 test: run os-specific tests on their real host, not a faked one
many tests patched sys.platform or a module's _IS_WINDOWS flag, then
ran on linux ci. the patch selects the branch under test, but the host
does not have the behavior the branch exists for. the test proves the
patch, not the platform. some gated assertions never ran on any host.

this commit adds three markers: linux_only, macos_only, windows_only.
a conftest hook skips a marked test on the other hosts, with a clear
reason. no test fakes a host now. two documented fakes remain
(android/termux, freebsd) because no ci runner exists for them.

each fake site got one of four treatments:
- gate it: the real host supplies the platform; mocks cover real
  dependencies only, never host identity
- patch the module's own probe when the subject is the probe's consumer
- assert against the real host when the fake stood in for any non-x host
- delete the patch when it set the value the host already has

bare skipif(sys.platform != ...) guards became markers too. the lane
model skips these on linux and never imports them on windows, so they
ran on no host. platform parametrize tables are now one marked test
per os.

running on real hosts found real errors: a chrome-sandbox failure in
test_gui_command that main hides, and two windows failures fixed here.
the agents.md testing section now documents the policy.
2026-08-09 22:09:49 -04:00

81 lines
2.4 KiB
Python

"""Tests for native clipboard text write (hermes_cli/clipboard.py).
Mirrors the TUI's writeClipboardText fallback chain: pbcopy /
PowerShell Set-Clipboard / wl-copy / xclip / xsel, with OSC 52 left to
the caller when every backend fails.
"""
import base64
import subprocess
from unittest.mock import patch
import pytest
from hermes_cli import clipboard as clip
def _completed(returncode=0):
return subprocess.CompletedProcess(args=[], returncode=returncode)
@pytest.mark.macos_only
def test_darwin_uses_pbcopy():
with patch.object(clip.subprocess, "run", return_value=_completed()) as run:
assert clip.write_clipboard_text("hello") is True
argv = run.call_args[0][0]
assert argv == ["pbcopy"]
assert run.call_args[1]["input"] == b"hello"
@pytest.mark.linux_only
def test_linux_falls_through_backends_until_success():
calls = []
def fake_run(argv, **kwargs):
calls.append(argv[0])
# xclip fails, xsel succeeds
return _completed(returncode=0 if argv[0] == "xsel" else 1)
with patch.object(clip, "_is_wsl", return_value=False), \
patch.dict(clip.os.environ, {}, clear=False), \
patch.object(clip.os.environ, "get", lambda k, d=None: None), \
patch.object(clip.subprocess, "run", side_effect=fake_run):
assert clip.write_clipboard_text("x") is True
assert calls == ["xclip", "xsel"]
class TestOsc52MultiplexerWrapping:
"""CLI _write_osc52_clipboard must wrap for tmux/screen passthrough
(mirrors ui-tui/src/lib/osc52.ts wrapForMultiplexer)."""
def _capture_seq(self, env):
import io
from unittest.mock import patch as _patch
from cli import HermesCLI
cli_obj = HermesCLI.__new__(HermesCLI)
cli_obj._app = None
buf = io.StringIO()
with _patch.dict(clip.os.environ, env, clear=False), \
_patch("cli.sys.stdout", buf):
for var in ("TMUX", "STY"):
if var not in env:
clip.os.environ.pop(var, None)
cli_obj._write_osc52_clipboard("hello")
return buf.getvalue()
def test_tmux_wraps_in_dcs_passthrough(self, monkeypatch):
monkeypatch.setenv("TMUX", "/tmp/tmux-123/default,1,0")
monkeypatch.delenv("STY", raising=False)
seq = self._capture_seq({"TMUX": "/tmp/tmux-123/default,1,0"})
assert seq.startswith("\x1bPtmux;")
assert "]52;c;" in seq
assert seq.endswith("\x1b\\")