Skip to content

Commit 125858a

Browse files
committed
tests(asyncio): harden server typing
1 parent 24b9987 commit 125858a

File tree

1 file changed

+46
-21
lines changed

1 file changed

+46
-21
lines changed

tests/asyncio/test_server.py

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,23 @@
88

99
import asyncio
1010
import logging
11+
from dataclasses import dataclass
1112
from typing import TYPE_CHECKING
1213

1314
import pytest
1415

1516
from libtmux.session import Session
1617

18+
19+
@dataclass(slots=True)
20+
class SessionQueryInfo:
21+
"""Structured data returned from async session queries."""
22+
23+
id: str
24+
name: str
25+
windows: int
26+
27+
1728
if TYPE_CHECKING:
1829
from libtmux.server import Server
1930

@@ -58,7 +69,9 @@ async def test_server_acmd_new_session(server: Server) -> None:
5869
# Verify we can get the session object
5970
session = Session.from_session_id(session_id=session_id, server=server)
6071
assert isinstance(session, Session)
61-
assert session.session_id == session_id
72+
session_obj_id = session.session_id
73+
assert session_obj_id is not None
74+
assert session_obj_id == session_id
6275

6376

6477
# ============================================================================
@@ -132,12 +145,15 @@ async def create_session(index: int) -> Session:
132145
assert all(isinstance(s, Session) for s in sessions)
133146

134147
# Verify all session IDs are unique
135-
session_ids = {s.session_id for s in sessions}
148+
session_ids: set[str] = set()
149+
for session in sessions:
150+
assert session.session_id is not None
151+
session_ids.add(session.session_id)
136152
assert len(session_ids) == 3
137153

138154
# Verify all sessions exist in server
139-
for session in sessions:
140-
assert server.has_session(str(session.session_id))
155+
for session_id in session_ids:
156+
assert server.has_session(session_id)
141157

142158

143159
@pytest.mark.asyncio
@@ -160,7 +176,7 @@ async def test_concurrent_session_queries(server: Server) -> None:
160176
)
161177
session_ids.append(result.stdout[0])
162178

163-
async def query_session(session_id: str) -> dict[str, str]:
179+
async def query_session(session_id: str) -> SessionQueryInfo:
164180
"""Query session information asynchronously."""
165181
result = await server.acmd(
166182
"display-message",
@@ -171,21 +187,19 @@ async def query_session(session_id: str) -> dict[str, str]:
171187
)
172188
output = result.stdout[0]
173189
parts = output.split(":")
174-
return {
175-
"id": parts[0],
176-
"name": parts[1],
177-
"windows": parts[2],
178-
}
190+
return SessionQueryInfo(id=parts[0], name=parts[1], windows=int(parts[2]))
179191

180192
# Query all sessions concurrently
181-
results = await asyncio.gather(*[query_session(sid) for sid in session_ids])
193+
results: list[SessionQueryInfo] = await asyncio.gather(
194+
*[query_session(sid) for sid in session_ids]
195+
)
182196

183197
# Verify all queries returned valid data
184198
assert len(results) == 5
185199
for i, info in enumerate(results):
186-
assert info["id"] == session_ids[i]
187-
assert info["name"] == f"query_test_{i}"
188-
assert int(info["windows"]) >= 1
200+
assert info.id == session_ids[i]
201+
assert info.name == f"query_test_{i}"
202+
assert info.windows >= 1
189203

190204

191205
@pytest.mark.asyncio
@@ -246,10 +260,14 @@ async def test_anew_session_basic(server: Server) -> None:
246260
session = await server.anew_session("test_anew_session")
247261

248262
# Verify session created with correct properties
249-
assert session.session_name == "test_anew_session"
263+
session_name = session.session_name
264+
assert session_name is not None
265+
assert session_name == "test_anew_session"
250266
assert server.has_session("test_anew_session")
251267
assert isinstance(session, Session)
252-
assert session.session_id.startswith("$")
268+
session_id = session.session_id
269+
assert session_id is not None
270+
assert session_id.startswith("$")
253271

254272

255273
@pytest.mark.asyncio
@@ -270,7 +288,9 @@ async def test_anew_session_with_environment(server: Server) -> None:
270288
)
271289

272290
# Verify session created
273-
assert session.session_name == "test_env_session"
291+
env_session_name = session.session_name
292+
assert env_session_name is not None
293+
assert env_session_name == "test_env_session"
274294
assert server.has_session("test_env_session")
275295

276296
# Verify environment variables were set
@@ -311,12 +331,15 @@ async def create_session(name: str) -> Session:
311331

312332
# Verify all have unique IDs and correct names
313333
expected_names = ["concurrent_a", "concurrent_b", "concurrent_c", "concurrent_d"]
314-
actual_names = [s.session_name for s in sessions]
334+
actual_names: list[str] = []
335+
for session in sessions:
336+
assert session.session_name is not None
337+
actual_names.append(session.session_name)
315338
assert sorted(actual_names) == sorted(expected_names)
316339

317340
# Verify all exist in server
318-
for session in sessions:
319-
assert server.has_session(session.session_name)
341+
for name in actual_names:
342+
assert server.has_session(name)
320343

321344

322345
# ============================================================================
@@ -341,7 +364,9 @@ async def test_ahas_session(server: Server) -> None:
341364
assert await server.ahas_session("nonexistent_session_xyz") is False
342365

343366
# Verify exact=True works with session ID
344-
assert await server.ahas_session(session.session_id, exact=True) is True
367+
session_id = session.session_id
368+
assert session_id is not None
369+
assert await server.ahas_session(session_id, exact=True) is True
345370

346371

347372
@pytest.mark.asyncio

0 commit comments

Comments
 (0)