@@ -75,67 +75,19 @@ def test_multiple_binds(multiple_config):
7575 assert isinstance (sa_manager .get_session ("async" ), AsyncSession )
7676
7777
78- async def test_engine_is_disposed_on_cleanup (multiple_config ):
79- sa_manager = SQLAlchemyBindManager (multiple_config )
80- sync_engine = sa_manager .get_bind ("default" ).engine
81- async_engine = sa_manager .get_bind ("async" ).engine
82-
83- original_sync_dispose = sync_engine .dispose
84- original_async_dispose = async_engine .dispose
85-
86- with (
87- patch .object (
88- sync_engine ,
89- "dispose" ,
90- wraps = original_sync_dispose ,
91- ) as mocked_dispose ,
92- patch .object (
93- type (async_engine ),
94- "dispose" ,
95- wraps = original_async_dispose ,
96- ) as mocked_async_dispose ,
97- ):
98- sa_manager = None
99-
100- mocked_dispose .assert_called_once ()
101- mocked_async_dispose .assert_called ()
102-
103-
104- def test_engine_is_disposed_on_cleanup_even_if_no_loop (multiple_config ):
105- sa_manager = SQLAlchemyBindManager (multiple_config )
106- sync_engine = sa_manager .get_bind ("default" ).engine
107- async_engine = sa_manager .get_bind ("async" ).engine
108-
109- original_sync_dispose = sync_engine .dispose
110- original_async_dispose = async_engine .dispose
111-
112- with (
113- patch .object (
114- sync_engine ,
115- "dispose" ,
116- wraps = original_sync_dispose ,
117- ) as mocked_dispose ,
118- patch .object (
119- type (async_engine ),
120- "dispose" ,
121- wraps = original_async_dispose ,
122- ) as mocked_async_dispose ,
123- ):
124- sa_manager = None
125-
126- mocked_dispose .assert_called_once ()
127- mocked_async_dispose .assert_called ()
128-
78+ def test_engine_is_disposed_on_cleanup (multiple_config ):
79+ """Test that engines are disposed synchronously during garbage collection.
12980
130- def test_engine_is_disposed_on_cleanup_even_if_loop_search_errors_out (
131- multiple_config ,
132- ):
81+ This test verifies that both sync and async engines are properly disposed
82+ using synchronous disposal (sync_engine.dispose() for async engines).
83+ """
13384 sa_manager = SQLAlchemyBindManager (multiple_config )
13485 sync_engine = sa_manager .get_bind ("default" ).engine
13586 async_engine = sa_manager .get_bind ("async" ).engine
13687
13788 original_sync_dispose = sync_engine .dispose
138- original_async_dispose = async_engine .dispose
89+ # For async engines, we now use sync_engine.dispose() for safe cleanup
90+ original_async_sync_dispose = async_engine .sync_engine .dispose
13991
14092 with (
14193 patch .object (
@@ -144,17 +96,12 @@ def test_engine_is_disposed_on_cleanup_even_if_loop_search_errors_out(
14496 wraps = original_sync_dispose ,
14597 ) as mocked_dispose ,
14698 patch .object (
147- type ( async_engine ) ,
99+ async_engine . sync_engine ,
148100 "dispose" ,
149- wraps = original_async_dispose ,
150- ) as mocked_async_dispose ,
151- patch (
152- "asyncio.get_event_loop" ,
153- side_effect = RuntimeError (),
154- ) as mocked_get_event_loop ,
101+ wraps = original_async_sync_dispose ,
102+ ) as mocked_async_sync_dispose ,
155103 ):
156104 sa_manager = None
157105
158- mocked_get_event_loop .assert_called_once ()
159106 mocked_dispose .assert_called_once ()
160- mocked_async_dispose . assert_called ()
107+ mocked_async_sync_dispose . assert_called_once ()
0 commit comments