@@ -357,6 +357,21 @@ async def test_async_client_normalizes_service_and_rejects_missing_ids(self):
357357 with self .assertRaises (RuntimeError ):
358358 await closed_client .get_assembly (assembly_id = "abc123" )
359359
360+ async def test_async_client_close_reopens_owned_session (self ):
361+ client = AsyncTransloadit ("key" , "secret" , service = self .server .base_url )
362+
363+ first_session = await client .request ._ensure_session ()
364+ self .assertFalse (first_session .closed )
365+
366+ await client .close ()
367+ self .assertTrue (first_session .closed )
368+
369+ second_session = await client .request ._ensure_session ()
370+ self .assertIsNot (first_session , second_session )
371+ self .assertFalse (second_session .closed )
372+
373+ await client .close ()
374+
360375 async def test_async_client_delete_template_get_bill_and_plain_text_fallback (self ):
361376 async with AsyncTransloadit ("key" , "secret" , service = self .server .base_url ) as client :
362377 response = await client .delete_template ("tpl-1" )
@@ -377,6 +392,59 @@ async def test_async_client_delete_template_get_bill_and_plain_text_fallback(sel
377392 self .assertEqual (response .status_code , 200 )
378393 self .assertEqual (response .headers ["X-Async-Route" ], "get_assembly_plain" )
379394
395+ async def test_async_assembly_create_returns_plain_text_response_without_crashing (self ):
396+ plain_response = Response (
397+ data = "plain assembly response" ,
398+ status_code = 502 ,
399+ headers = {"X-Async-Route" : "plain" },
400+ )
401+
402+ async with AsyncTransloadit ("key" , "secret" , service = self .server .base_url ) as client :
403+ assembly = client .new_assembly ()
404+
405+ with mock .patch .object (client .request , "post" , new = mock .AsyncMock (return_value = plain_response )) as post_mock :
406+ with mock .patch .object (client , "get_assembly" , new = mock .AsyncMock ()) as get_mock :
407+ with mock .patch ("asyncio.sleep" , new_callable = mock .AsyncMock ) as sleep_mock :
408+ response = await assembly .create (wait = True , resumable = False )
409+
410+ self .assertIs (response , plain_response )
411+ self .assertEqual (response .data , "plain assembly response" )
412+ post_mock .assert_awaited_once ()
413+ get_mock .assert_not_awaited ()
414+ sleep_mock .assert_not_awaited ()
415+
416+ async def test_async_assembly_wait_returns_plain_text_poll_response_without_crashing (self ):
417+ initial_response = Response (
418+ data = {
419+ "ok" : "ASSEMBLY_PROCESSING" ,
420+ "info" : {"retryIn" : 0 },
421+ "assembly_ssl_url" : f"{ self .server .base_url } /assemblies/assembly-123" ,
422+ },
423+ status_code = 200 ,
424+ headers = {"X-Async-Route" : "initial" },
425+ )
426+ plain_response = Response (
427+ data = "plain assembly response" ,
428+ status_code = 502 ,
429+ headers = {"X-Async-Route" : "plain" },
430+ )
431+
432+ async with AsyncTransloadit ("key" , "secret" , service = self .server .base_url ) as client :
433+ assembly = client .new_assembly ()
434+
435+ with mock .patch .object (client .request , "post" , new = mock .AsyncMock (return_value = initial_response )) as post_mock :
436+ with mock .patch .object (client , "get_assembly" , new = mock .AsyncMock (return_value = plain_response )) as get_mock :
437+ with mock .patch ("asyncio.sleep" , new_callable = mock .AsyncMock ) as sleep_mock :
438+ response = await assembly .create (wait = True , resumable = False )
439+
440+ self .assertIs (response , plain_response )
441+ self .assertEqual (response .data , "plain assembly response" )
442+ post_mock .assert_awaited_once ()
443+ get_mock .assert_awaited_once_with (
444+ assembly_url = f"{ self .server .base_url } /assemblies/assembly-123"
445+ )
446+ sleep_mock .assert_awaited_once_with (0 )
447+
380448 def test_async_signed_smart_cdn_url_matches_sync_and_rejects_bad_types (self ):
381449 async_client = AsyncTransloadit ("test-key" , "test-secret" )
382450 sync_client = Transloadit ("test-key" , "test-secret" )
0 commit comments