30da5d0a89
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.
81 lines
2.4 KiB
Python
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\\")
|
|
|
|
|