Skip to content

Commit fb405ed

Browse files
committed
!squash more
1 parent bbb42eb commit fb405ed

File tree

2 files changed

+132
-0
lines changed

2 files changed

+132
-0
lines changed

src/libtmux/pytest_plugin.py

+41
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,44 @@ def session(
256256
assert TEST_SESSION_NAME != "tmuxp"
257257

258258
return session
259+
260+
261+
def TempServer(socket_name: str | None = None, **kwargs: t.Any) -> Server:
262+
"""Create a temporary tmux server that cleans up after itself.
263+
264+
This is similar to the server pytest fixture, but can be used outside of pytest.
265+
The server will be killed when the object is garbage collected.
266+
267+
Parameters
268+
----------
269+
socket_name : str, optional
270+
Name for the tmux socket. If not provided, a random one will be generated.
271+
**kwargs : dict
272+
Additional arguments to pass to Server constructor
273+
274+
Returns
275+
-------
276+
Server
277+
A Server instance that will clean up after itself
278+
279+
Examples
280+
--------
281+
>>> server = TempServer()
282+
>>> server.new_session()
283+
Session($... ...)
284+
>>> server.is_alive()
285+
True
286+
>>> del server # Server is automatically killed
287+
"""
288+
if socket_name is None:
289+
socket_name = f"libtmux_test{next(namer)}"
290+
291+
server = Server(socket_name=socket_name, **kwargs)
292+
293+
def fin() -> None:
294+
"""Kill server if it exists."""
295+
if server.is_alive():
296+
server.kill()
297+
298+
server.__del__ = fin # type: ignore
299+
return server

tests/test_pytest_plugin.py

+91
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
from __future__ import annotations
44

5+
import pathlib
56
import textwrap
67
import typing as t
8+
import time
79

810
if t.TYPE_CHECKING:
911
import pytest
@@ -71,3 +73,92 @@ def test_repo_git_remote_checkout(
7173
# Test
7274
result = pytester.runpytest(str(first_test_filename))
7375
result.assert_outcomes(passed=1)
76+
77+
78+
def test_temp_server() -> None:
79+
"""Test TempServer creates and cleans up server."""
80+
from libtmux.pytest_plugin import TempServer
81+
82+
server = TempServer()
83+
assert server.is_alive() is False # Server not started yet
84+
85+
session = server.new_session()
86+
assert server.is_alive() is True
87+
assert len(server.sessions) == 1
88+
assert session.session_name is not None
89+
90+
# Test custom socket name
91+
custom_server = TempServer(socket_name="test_custom")
92+
assert custom_server.socket_name == "test_custom"
93+
94+
# Test cleanup
95+
del server
96+
del custom_server
97+
98+
99+
def test_temp_server_with_config(tmp_path: pathlib.Path) -> None:
100+
"""Test TempServer with custom config."""
101+
from libtmux.pytest_plugin import TempServer
102+
103+
config_file = tmp_path / "tmux.conf"
104+
config_file.write_text("set -g base-index 1", encoding="utf-8")
105+
106+
server = TempServer(config_file=str(config_file))
107+
session = server.new_session()
108+
109+
# Verify config was loaded by checking base-index
110+
assert session.show_options("-g", "base-index")["base-index"] == "1"
111+
112+
del server
113+
114+
115+
def test_temp_server_cleanup() -> None:
116+
"""Test TempServer properly cleans up after itself."""
117+
from libtmux.pytest_plugin import TempServer
118+
119+
server = TempServer()
120+
socket_name = server.socket_name
121+
assert socket_name is not None
122+
123+
# Create multiple sessions
124+
server.new_session(session_name="test1")
125+
server.new_session(session_name="test2")
126+
assert len(server.sessions) == 2
127+
128+
# Verify server is alive
129+
assert server.is_alive() is True
130+
131+
# Delete server and verify cleanup
132+
del server
133+
time.sleep(0.1) # Give time for cleanup
134+
135+
# Create new server with same socket name to verify old one was cleaned up
136+
new_server = TempServer(socket_name=socket_name)
137+
assert new_server.is_alive() is False # Server not started yet
138+
new_server.new_session() # This should work if old server was cleaned up
139+
assert new_server.is_alive() is True
140+
del new_server
141+
142+
143+
def test_temp_server_multiple() -> None:
144+
"""Test multiple TempServer instances can coexist."""
145+
from libtmux.pytest_plugin import TempServer
146+
147+
server1 = TempServer()
148+
server2 = TempServer()
149+
150+
# Each server should have a unique socket
151+
assert server1.socket_name != server2.socket_name
152+
153+
# Create sessions in each server
154+
session1 = server1.new_session(session_name="test1")
155+
session2 = server2.new_session(session_name="test2")
156+
157+
# Verify sessions are in correct servers
158+
assert any(s.session_name == "test1" for s in server1.sessions)
159+
assert any(s.session_name == "test2" for s in server2.sessions)
160+
assert not any(s.session_name == "test1" for s in server2.sessions)
161+
assert not any(s.session_name == "test2" for s in server1.sessions)
162+
163+
del server1
164+
del server2

0 commit comments

Comments
 (0)