88
99import asyncio
1010import logging
11+ from dataclasses import dataclass
1112from typing import TYPE_CHECKING
1213
1314import pytest
1415
1516from 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+
1728if 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