1111from ydb .query .session import QuerySession
1212
1313
14- def _check_session_state_empty (session : QuerySession ):
15- assert session ._state .session_id is None
16- assert session ._state .node_id is None
17- assert not session ._state .attached
14+ def _check_session_not_ready (session : QuerySession ):
15+ assert not session .is_active
1816
1917
20- def _check_session_state_full (session : QuerySession ):
21- assert session ._state .session_id is not None
22- assert session ._state .node_id is not None
23- assert session ._state .attached
18+ def _check_session_ready (session : QuerySession ):
19+ assert session .session_id is not None
20+ assert session .node_id is not None
21+ assert session .is_active
22+ assert not session .is_closed
2423
2524
2625class TestQuerySession :
2726 def test_session_normal_lifecycle (self , session : QuerySession ):
28- _check_session_state_empty (session )
27+ _check_session_not_ready (session )
2928
3029 session .create ()
31- _check_session_state_full (session )
30+ _check_session_ready (session )
3231
3332 session .delete ()
34- _check_session_state_empty ( session )
33+ assert session . is_closed
3534
3635 def test_second_create_do_nothing (self , session : QuerySession ):
3736 session .create ()
38- _check_session_state_full (session )
37+ _check_session_ready (session )
3938
40- session_id_before = session ._state . session_id
41- node_id_before = session ._state . node_id
39+ session_id_before = session .session_id
40+ node_id_before = session .node_id
4241
4342 session .create ()
44- _check_session_state_full (session )
43+ _check_session_ready (session )
4544
46- assert session ._state . session_id == session_id_before
47- assert session ._state . node_id == node_id_before
45+ assert session .session_id == session_id_before
46+ assert session .node_id == node_id_before
4847
4948 def test_second_delete_do_nothing (self , session : QuerySession ):
5049 session .create ()
5150
5251 session .delete ()
5352 session .delete ()
5453
55- def test_delete_before_create_not_possible (self , session : QuerySession ):
56- with pytest . raises ( RuntimeError ):
57- session .delete ()
54+ def test_delete_before_create_is_noop (self , session : QuerySession ):
55+ session . delete ()
56+ assert session .is_closed
5857
5958 def test_create_after_delete_not_possible (self , session : QuerySession ):
6059 session .create ()
@@ -119,18 +118,31 @@ def test_thread_leaks(self, session: QuerySession):
119118 assert "attach stream thread" in thread_names
120119
121120 def test_first_resp_timeout (self , session : QuerySession ):
121+ class FakeResponse :
122+ """Fake response that passes through ServerStatus.from_proto()"""
123+
124+ status = 0 # SUCCESS
125+ issues = []
126+
122127 class FakeStream :
128+ def __init__ (self ):
129+ self .cancel_called = False
130+ self ._cancelled = threading .Event ()
131+
123132 def __iter__ (self ):
124133 return self
125134
126135 def __next__ (self ):
127- time .sleep (10 )
128- return 1
136+ # Wait until cancelled or timeout
137+ self ._cancelled .wait (timeout = 10 )
138+ # Return fake response instead of raising - avoids thread exception warning
139+ return FakeResponse ()
129140
130141 def cancel (self ):
131- pass
142+ self .cancel_called = True
143+ self ._cancelled .set ()
132144
133- fake_stream = mock . Mock ( spec = FakeStream )
145+ fake_stream = FakeStream ( )
134146
135147 session ._attach_call = mock .MagicMock (return_value = fake_stream )
136148 assert session ._attach_call () == fake_stream
@@ -139,13 +151,16 @@ def cancel(self):
139151 with pytest .raises (b .TimeoutError ):
140152 session ._attach (0.1 )
141153
142- fake_stream .cancel .assert_called ()
154+ assert fake_stream .cancel_called
155+
156+ # Give background thread time to finish
157+ time .sleep (0.1 )
143158
144159 thread_names = [t .name for t in threading .enumerate ()]
145160 assert "first response attach stream thread" not in thread_names
146161 assert "attach stream thread" not in thread_names
147162
148- _check_session_state_empty ( session )
163+ assert session . is_closed
149164
150165 @pytest .mark .parametrize (
151166 "stats_mode" ,
0 commit comments