Skip to content

Commit cbcc851

Browse files
committed
refactor(tests): add shell-agnostic test helper
Add setup_shell_window helper function to standardize shell setup in tests: Set consistent shell environment and prompt, add robust waiting for shell readiness, handle environment variables consistently, prevent shell-specific prompt modifications. Update test_new_window_with_environment to use new helper: Add proper waiting for command output, fix linting issues with loop variables, make tests more reliable against timing issues.
1 parent 2dc7e60 commit cbcc851

File tree

1 file changed

+62
-17
lines changed

1 file changed

+62
-17
lines changed

tests/test_session.py

+62-17
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
from libtmux.common import has_gte_version, has_lt_version
1313
from libtmux.constants import WindowDirection
1414
from libtmux.pane import Pane
15+
from libtmux.server import Server
1516
from libtmux.session import Session
1617
from libtmux.test.constants import TEST_SESSION_PREFIX
1718
from libtmux.test.random import namer
19+
from libtmux.test.retry import retry_until
1820
from libtmux.window import Window
1921

2022
if t.TYPE_CHECKING:
@@ -23,6 +25,47 @@
2325
logger = logging.getLogger(__name__)
2426

2527

28+
def setup_shell_window(
29+
session: Session,
30+
window_name: str,
31+
environment: dict[str, str] | None = None,
32+
) -> Window:
33+
"""Set up a shell window with consistent environment and prompt.
34+
35+
Args:
36+
session: The tmux session to create the window in
37+
window_name: Name for the new window
38+
environment: Optional environment variables to set in the window
39+
40+
Returns
41+
-------
42+
The created Window object with shell ready
43+
"""
44+
env = shutil.which("env")
45+
assert env is not None, "Cannot find usable `env` in PATH."
46+
47+
window = session.new_window(
48+
attach=True,
49+
window_name=window_name,
50+
window_shell=f"{env} PROMPT_COMMAND='' PS1='READY>' sh",
51+
environment=environment,
52+
)
53+
54+
pane = window.active_pane
55+
assert pane is not None
56+
57+
# Wait for shell to be ready
58+
def wait_for_prompt() -> bool:
59+
try:
60+
pane_contents = "\n".join(pane.capture_pane())
61+
return "READY>" in pane_contents and len(pane_contents.strip()) > 0
62+
except Exception:
63+
return False
64+
65+
retry_until(wait_for_prompt, 2, raises=True)
66+
return window
67+
68+
2669
def test_has_session(server: Server, session: Session) -> None:
2770
"""Server.has_session returns True if has session_name exists."""
2871
TEST_SESSION_NAME = session.session_name
@@ -328,20 +371,26 @@ def test_new_window_with_environment(
328371
environment: dict[str, str],
329372
) -> None:
330373
"""Verify new window with environment vars."""
331-
env = shutil.which("env")
332-
assert env is not None, "Cannot find usable `env` in PATH."
333-
334-
window = session.new_window(
335-
attach=True,
336-
window_name="window_with_environment",
337-
window_shell=f"{env} PS1='$ ' sh",
374+
window = setup_shell_window(
375+
session,
376+
"window_with_environment",
338377
environment=environment,
339378
)
340379
pane = window.active_pane
341380
assert pane is not None
342-
for k, v in environment.items():
343-
pane.send_keys(f"echo ${k}")
344-
assert pane.capture_pane()[-2] == v
381+
382+
for k, expected_value in environment.items():
383+
pane.send_keys(f"echo ${k}", literal=True)
384+
385+
# Wait for command output
386+
def wait_for_output(value: str = expected_value) -> bool:
387+
try:
388+
pane_contents = pane.capture_pane()
389+
return any(value in line for line in pane_contents)
390+
except Exception:
391+
return False
392+
393+
retry_until(wait_for_output, 2, raises=True)
345394

346395

347396
@pytest.mark.skipif(
@@ -353,13 +402,9 @@ def test_new_window_with_environment_logs_warning_for_old_tmux(
353402
caplog: pytest.LogCaptureFixture,
354403
) -> None:
355404
"""Verify new window with environment vars create a warning if tmux is too old."""
356-
env = shutil.which("env")
357-
assert env is not None, "Cannot find usable `env` in PATH."
358-
359-
session.new_window(
360-
attach=True,
361-
window_name="window_with_environment",
362-
window_shell=f"{env} PS1='$ ' sh",
405+
setup_shell_window(
406+
session,
407+
"window_with_environment",
363408
environment={"ENV_VAR": "window"},
364409
)
365410

0 commit comments

Comments
 (0)