@@ -190,6 +190,24 @@ def test_only_browser_metadata_endpoints_warm_route_cache() -> None:
190190 assert response .is_closed is True
191191
192192
193+ @respx .mock
194+ def test_browser_pool_acquire_warms_route_cache () -> None :
195+ acquire_route = respx .post (f"{ base_url } /browser_pools/pool-1/acquire" ).mock (
196+ return_value = httpx .Response (200 , json = _fake_browser ())
197+ )
198+ routed_request = respx .get ("http://browser-session.test/browser/kernel/curl/raw" ).mock (
199+ return_value = httpx .Response (200 , content = b"ok" )
200+ )
201+ with Kernel (base_url = base_url , api_key = api_key , _strict_response_validation = True ) as client :
202+ response = client .browser_pools .with_raw_response .acquire ("pool-1" )
203+ routed = client .browsers .request ("sess-1" , "GET" , "https://example.com" )
204+
205+ assert acquire_route .called
206+ assert response .is_closed is True
207+ assert routed .status_code == 200
208+ assert routed_request .called
209+
210+
193211@respx .mock
194212def test_browser_delete_by_id_evicts_route_cache () -> None :
195213 delete_route = respx .delete (f"{ base_url } /browsers/sess-1" ).mock (return_value = httpx .Response (204 ))
@@ -203,6 +221,19 @@ def test_browser_delete_by_id_evicts_route_cache() -> None:
203221 assert response .is_closed is True
204222
205223
224+ @respx .mock
225+ def test_browser_pool_release_evicts_route_cache () -> None :
226+ release_route = respx .post (f"{ base_url } /browser_pools/pool-1/release" ).mock (return_value = httpx .Response (204 ))
227+ with Kernel (base_url = base_url , api_key = api_key , _strict_response_validation = True ) as client :
228+ _cache_browser (client )
229+ response = client .browser_pools .with_raw_response .release ("pool-1" , session_id = "sess-1" )
230+ with pytest .raises (ValueError , match = "route cache" ):
231+ client .browsers .request ("sess-1" , "GET" , "https://example.com" )
232+
233+ assert release_route .called
234+ assert response .is_closed is True
235+
236+
206237@respx .mock
207238def test_failed_browser_delete_by_id_keeps_route_cache () -> None :
208239 delete_route = respx .delete (f"{ base_url } /browsers/sess-1" ).mock (
@@ -222,6 +253,41 @@ def test_failed_browser_delete_by_id_keeps_route_cache() -> None:
222253 assert routed_request .called
223254
224255
256+ @respx .mock
257+ def test_failed_browser_pool_release_keeps_route_cache () -> None :
258+ release_route = respx .post (f"{ base_url } /browser_pools/pool-1/release" ).mock (
259+ return_value = httpx .Response (500 , json = {"error" : "boom" })
260+ )
261+ routed_request = respx .get ("http://browser-session.test/browser/kernel/curl/raw" ).mock (
262+ return_value = httpx .Response (200 , content = b"ok" )
263+ )
264+ with Kernel (base_url = base_url , api_key = api_key , _strict_response_validation = True ) as client :
265+ _cache_browser (client )
266+ with pytest .raises (InternalServerError ):
267+ client .browser_pools .release ("pool-1" , session_id = "sess-1" )
268+ routed = client .browsers .request ("sess-1" , "GET" , "https://example.com" )
269+
270+ assert release_route .called
271+ assert routed .status_code == 200
272+ assert routed_request .called
273+
274+
275+ @pytest .mark .asyncio
276+ @respx .mock
277+ async def test_async_browser_pool_release_evicts_route_cache () -> None :
278+ release_route = respx .post (f"{ base_url } /browser_pools/pool-1/release" ).mock (return_value = httpx .Response (204 ))
279+ async with AsyncKernel (base_url = base_url , api_key = api_key , _strict_response_validation = True ) as client :
280+ route = browser_route_from_browser (_fake_browser ())
281+ assert route is not None
282+ client .browser_route_cache .set (route )
283+ response = await client .browser_pools .with_raw_response .release ("pool-1" , session_id = "sess-1" )
284+ with pytest .raises (ValueError , match = "route cache" ):
285+ await client .browsers .request ("sess-1" , "GET" , "https://example.com" )
286+
287+ assert release_route .called
288+ assert response .is_closed is True
289+
290+
225291def test_browser_route_cache_normalizes_session_id_keys () -> None :
226292 cache = BrowserRouteCache ()
227293 cache .set (
0 commit comments