Skip to content

Commit 245da21

Browse files
committed
fix(doctests): Use lowercase server fixture instead of creating Server
Critical fix: The command_runner property doctest was creating `Server(socket_name="default")` which would: 1. Get wrapped by TestServer factory (via conftest.py:44) 2. Get tracked with socket name "default" in created_sockets 3. Get killed by TestServer finalizer at test suite end 4. KILL THE USER'S ACTUAL TMUX SESSION if they ran tests from inside tmux Solution: Use the lowercase `server` fixture that's already injected into the doctest namespace (conftest.py:43). The fixture has a unique socket name like `libtmux_test3k9m7x2q` that's properly tracked and cleaned up without touching the user's session. Also fixed 6 test violations that used hardcoded socket names or reused fixture sockets: - tests/test_command_runner.py: 4 tests now use TestServer fixture - tests/control_mode/test_runner.py: 1 test uses TestServer - tests/control_mode/test_benchmarks.py: 1 test uses TestServer All tests now follow the proven pattern of using fixtures for unique socket names and automatic cleanup. Fixes: User's tmux session being killed when running `uv run pytest`
1 parent cc4f422 commit 245da21

File tree

4 files changed

+25
-17
lines changed

4 files changed

+25
-17
lines changed

src/libtmux/server.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,6 @@ def command_runner(self) -> CommandRunner:
204204
205205
Examples
206206
--------
207-
>>> server = Server(socket_name="default")
208207
>>> assert server.command_runner is not None
209208
>>> type(server.command_runner).__name__
210209
'SubprocessCommandRunner'

tests/control_mode/test_benchmarks.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,18 +159,22 @@ def test_benchmark_server_integration_subprocess(server: Server) -> None:
159159

160160

161161
@pytest.mark.benchmark
162-
def test_benchmark_server_integration_control_mode(server: Server) -> None:
162+
def test_benchmark_server_integration_control_mode(
163+
TestServer: t.Callable[..., Server],
164+
) -> None:
163165
"""Benchmark Server with control mode runner.
164166
165167
This tests the performance of high-level Server API using control mode.
166168
Note: Operations with format strings still use subprocess fallback.
167169
"""
168-
assert server.socket_name
169-
control_runner = ControlModeCommandRunner(server.socket_name)
170+
# Create independent server with unique socket
171+
test_server = TestServer()
172+
assert test_server.socket_name
173+
control_runner = ControlModeCommandRunner(test_server.socket_name)
170174

171175
# Create server with control mode runner
172176
cm_server = Server(
173-
socket_name=server.socket_name,
177+
socket_name=test_server.socket_name,
174178
command_runner=control_runner,
175179
)
176180

tests/control_mode/test_runner.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,18 +223,20 @@ def test_runner_preserves_output_format(server: Server, session: Session) -> Non
223223
control_runner.close()
224224

225225

226-
def test_runner_with_server_integration(server: Server) -> None:
226+
def test_runner_with_server_integration(TestServer: t.Callable[..., Server]) -> None:
227227
"""Server works correctly with control mode runner.
228228
229229
Control mode runner transparently falls back to subprocess for commands
230230
with format strings (-F flag), ensuring all operations work correctly.
231231
"""
232-
assert server.socket_name
233-
runner = ControlModeCommandRunner(server.socket_name)
232+
# Create independent server with unique socket
233+
test_server = TestServer()
234+
assert test_server.socket_name
235+
runner = ControlModeCommandRunner(test_server.socket_name)
234236

235237
# Create server with control mode runner
236238
cm_server = Server(
237-
socket_name=server.socket_name,
239+
socket_name=test_server.socket_name,
238240
command_runner=runner,
239241
)
240242

tests/test_command_runner.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,17 @@ def test_server_default_runner(server: Server) -> None:
3030
assert isinstance(server.command_runner, SubprocessCommandRunner)
3131

3232

33-
def test_server_custom_runner() -> None:
33+
def test_server_custom_runner(TestServer: t.Callable[..., Server]) -> None:
3434
"""Server accepts custom command runner."""
3535
custom_runner = SubprocessCommandRunner()
36-
server = Server(socket_name="test", command_runner=custom_runner)
36+
server = TestServer()
37+
server.command_runner = custom_runner
3738
assert server.command_runner is custom_runner
3839

3940

40-
def test_server_runner_lazy_init() -> None:
41+
def test_server_runner_lazy_init(TestServer: t.Callable[..., Server]) -> None:
4142
"""Server lazily initializes command runner."""
42-
server = Server(socket_name="test")
43+
server = TestServer()
4344
# Access property to trigger lazy init
4445
runner = server.command_runner
4546
assert isinstance(runner, SubprocessCommandRunner)
@@ -113,10 +114,12 @@ def test_runner_with_test_server_factory(TestServer: t.Callable[..., Server]) ->
113114
assert isinstance(server2.command_runner, SubprocessCommandRunner)
114115

115116

116-
def test_backward_compatibility_no_runner_param(server: Server) -> None:
117+
def test_backward_compatibility_no_runner_param(
118+
TestServer: t.Callable[..., Server],
119+
) -> None:
117120
"""Server works without command_runner parameter (backward compatibility)."""
118121
# Create server without command_runner parameter
119-
new_server = Server(socket_name=f"test_{server.socket_name}")
122+
new_server = TestServer()
120123

121124
# Should auto-initialize with SubprocessCommandRunner
122125
assert new_server.command_runner is not None
@@ -127,9 +130,9 @@ def test_backward_compatibility_no_runner_param(server: Server) -> None:
127130
assert hasattr(result, "stdout")
128131

129132

130-
def test_runner_setter() -> None:
133+
def test_runner_setter(TestServer: t.Callable[..., Server]) -> None:
131134
"""Server.command_runner can be set after initialization."""
132-
server = Server(socket_name="test")
135+
server = TestServer()
133136

134137
# Initial runner
135138
initial_runner = server.command_runner

0 commit comments

Comments
 (0)