1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
|
"""Test for libtmux Session object."""
from __future__ import annotations
import logging
import shutil
import typing as t
import pytest
from libtmux import exc
from libtmux.pane import Pane
from libtmux.session import Session
from libtmux.test.constants import TEST_SESSION_PREFIX
from libtmux.test.random import namer
from libtmux.window import Window
if t.TYPE_CHECKING:
from libtmux.server import Server
logger = logging.getLogger(__name__)
def test_has_session(server: Server, session: Session) -> None:
"""Server.has_session returns True if has session_name exists."""
TEST_SESSION_NAME = session.get("session_name")
assert TEST_SESSION_NAME is not None
assert server.has_session(TEST_SESSION_NAME)
assert not server.has_session(TEST_SESSION_NAME[:-2])
assert server.has_session(TEST_SESSION_NAME[:-2], exact=False)
assert not server.has_session("asdf2314324321")
def test_select_window(session: Session) -> None:
"""Session.select_window moves window."""
# get the current window_base_index, since different user tmux config
# may start at 0 or 1, or whatever they want.
window_idx = session.attached_window.get("window_index")
assert window_idx is not None
window_base_index = int(window_idx)
session.new_window(window_name="test_window")
window_count = len(session._windows)
assert window_count >= 2 # 2 or more windows
assert len(session._windows) == window_count
# tmux selects a window, moves to it, shows it as attached_window
selected_window1 = session.select_window(window_base_index)
assert isinstance(selected_window1, Window)
attached_window1 = session.attached_window
assert selected_window1.id == attached_window1.id
# again: tmux selects a window, moves to it, shows it as
# attached_window
selected_window2 = session.select_window(window_base_index + 1)
assert isinstance(selected_window2, Window)
attached_window2 = session.attached_window
assert selected_window2.id == attached_window2.id
# assure these windows were really different
assert selected_window1.id != selected_window2.id
def test_select_window_returns_Window(session: Session) -> None:
"""Session.select_window returns Window object."""
window_count = len(session._windows)
assert len(session._windows) == window_count
window_idx = session.attached_window.get("window_index")
assert window_idx is not None
window_base_index = int(window_idx)
window = session.select_window(window_base_index)
assert isinstance(window, Window)
def test_attached_window(session: Session) -> None:
"""Session.attached_window returns Window."""
assert isinstance(session.attached_window, Window)
def test_attached_pane(session: Session) -> None:
"""Session.attached_pane returns Pane."""
assert isinstance(session.attached_pane, Pane)
def test_session_rename(session: Session) -> None:
"""Session.rename_session renames session."""
session_name = session.get("session_name")
assert session_name is not None
TEST_SESSION_NAME = session_name
test_name = "testingdis_sessname"
session.rename_session(test_name)
session_name = session.get("session_name")
assert session_name is not None
assert session_name == test_name
session.rename_session(TEST_SESSION_NAME)
session_name = session.get("session_name")
assert session_name is not None
assert session_name == TEST_SESSION_NAME
def test_new_session(server: Server) -> None:
"""Server.new_session creates new session."""
new_session_name = TEST_SESSION_PREFIX + next(namer)
new_session = server.new_session(session_name=new_session_name, detach=True)
assert isinstance(new_session, Session)
assert new_session.get("session_name") == new_session_name
def test_show_options(session: Session) -> None:
"""Session._show_options() returns dict."""
options = session._show_options()
assert isinstance(options, dict)
def test_set_show_options_single(session: Session) -> None:
"""Set option then Session._show_options(key)."""
session.set_option("history-limit", 20)
assert session._show_option("history-limit") == 20
session.set_option("history-limit", 40)
assert session._show_option("history-limit") == 40
assert session._show_options()["history-limit"] == 40
def test_set_show_option(session: Session) -> None:
"""Set option then Session._show_option(key)."""
session.set_option("history-limit", 20)
assert session._show_option("history-limit") == 20
session.set_option("history-limit", 40)
assert session._show_option("history-limit") == 40
def test_empty_session_option_returns_None(session: Session) -> None:
"""Verify Session._show_option returns None for unset option."""
assert session._show_option("default-shell") is None
def test_show_option_unknown(session: Session) -> None:
"""Session.show_option raises InvalidOption for invalid option."""
with pytest.raises(exc.InvalidOption):
session.show_option("moooz")
def test_show_option_ambiguous(session: Session) -> None:
"""Session._show_option raises AmbiguousOption for ambiguous option."""
with pytest.raises(exc.AmbiguousOption):
session._show_option("default-")
def test_set_option_ambiguous(session: Session) -> None:
"""Session.set_option raises AmbiguousOption for invalid option."""
with pytest.raises(exc.AmbiguousOption):
session.set_option("default-", 43)
def test_set_option_invalid(session: Session) -> None:
"""Session.set_option raises InvalidOption for invalid option."""
with pytest.raises(exc.InvalidOption):
session.set_option("afewewfew", 43)
def test_show_environment(session: Session) -> None:
"""Session.show_environment() returns dict."""
vars_ = session.show_environment()
assert isinstance(vars_, dict)
def test_set_show_environment_single(session: Session) -> None:
"""Set environment then Session.show_environment(key)."""
session.set_environment("FOO", "BAR")
assert session.getenv("FOO") == "BAR"
session.set_environment("FOO", "DAR")
assert session.getenv("FOO") == "DAR"
assert session.show_environment()["FOO"] == "DAR"
def test_show_environment_not_set(session: Session) -> None:
"""Not set environment variable returns None."""
assert session.getenv("BAR") is None
def test_remove_environment(session: Session) -> None:
"""Remove environment variable."""
assert session.getenv("BAM") is None
session.set_environment("BAM", "OK")
assert session.getenv("BAM") == "OK"
session.remove_environment("BAM")
assert session.getenv("BAM") is None
def test_unset_environment(session: Session) -> None:
"""Unset environment variable."""
assert session.getenv("BAM") is None
session.set_environment("BAM", "OK")
assert session.getenv("BAM") == "OK"
session.unset_environment("BAM")
assert session.getenv("BAM") is None
@pytest.mark.parametrize(
("session_name", "raises"),
[("hey.period", True), ("hey:its a colon", True), ("hey moo", False)],
)
def test_periods_raise_badsessionname(
server: Server,
session: Session,
session_name: str,
raises: bool,
) -> None:
"""Verify session names with periods raise BadSessionName."""
new_name = session_name + "moo" # used for rename / switch
if raises:
with pytest.raises(exc.BadSessionName):
session.rename_session(new_name)
with pytest.raises(exc.BadSessionName):
server.new_session(session_name)
with pytest.raises(exc.BadSessionName):
server.has_session(session_name)
with pytest.raises(exc.BadSessionName):
server.switch_client(new_name)
with pytest.raises(exc.BadSessionName):
server.attach_session(new_name)
else:
server.new_session(session_name)
server.has_session(session_name)
session.rename_session(new_name)
with pytest.raises(exc.LibTmuxException):
server.switch_client(new_name)
def test_cmd_inserts_session_id(session: Session) -> None:
"""Verify Session.cmd() inserts session_id."""
current_session_id = session.id
last_arg = "last-arg"
cmd = session.cmd("not-a-command", last_arg)
assert "-t" in cmd.cmd
assert current_session_id in cmd.cmd
assert cmd.cmd[-1] == last_arg
@pytest.mark.parametrize(
"environment",
[
{"ENV_VAR": "window"},
{"ENV_VAR_1": "window_1", "ENV_VAR_2": "window_2"},
],
)
def test_new_window_with_environment(
session: Session,
environment: dict[str, str],
) -> None:
"""Verify new window with environment vars."""
env = shutil.which("env")
assert env is not None, "Cannot find usable `env` in PATH."
window = session.new_window(
attach=True,
window_name="window_with_environment",
window_shell=f"{env} PS1='$ ' sh",
environment=environment,
)
pane = window.attached_pane
assert pane is not None
for k, v in environment.items():
pane.send_keys(f"echo ${k}")
assert pane.capture_pane()[-2] == v
|