@@ -392,7 +392,7 @@ async def test_async_client_delete_template_get_bill_and_plain_text_fallback(sel
392392 self .assertEqual (response .status_code , 200 )
393393 self .assertEqual (response .headers ["X-Async-Route" ], "get_assembly_plain" )
394394
395- async def test_async_assembly_create_returns_plain_text_response_without_crashing (self ):
395+ async def test_async_assembly_create_raises_on_plain_text_error_response (self ):
396396 plain_response = Response (
397397 data = "plain assembly response" ,
398398 status_code = 502 ,
@@ -403,17 +403,12 @@ async def test_async_assembly_create_returns_plain_text_response_without_crashin
403403 assembly = client .new_assembly ()
404404
405405 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 )
406+ with self .assertRaises (RuntimeError ):
407+ await assembly .create (wait = True , resumable = False )
409408
410- self .assertIs (response , plain_response )
411- self .assertEqual (response .data , "plain assembly response" )
412409 post_mock .assert_awaited_once ()
413- get_mock .assert_not_awaited ()
414- sleep_mock .assert_not_awaited ()
415410
416- async def test_async_assembly_wait_returns_plain_text_poll_response_without_crashing (self ):
411+ async def test_async_assembly_wait_raises_on_plain_text_poll_response (self ):
417412 initial_response = Response (
418413 data = {
419414 "ok" : "ASSEMBLY_PROCESSING" ,
@@ -435,10 +430,9 @@ async def test_async_assembly_wait_returns_plain_text_poll_response_without_cras
435430 with mock .patch .object (client .request , "post" , new = mock .AsyncMock (return_value = initial_response )) as post_mock :
436431 with mock .patch .object (client , "get_assembly" , new = mock .AsyncMock (return_value = plain_response )) as get_mock :
437432 with mock .patch ("asyncio.sleep" , new_callable = mock .AsyncMock ) as sleep_mock :
438- response = await assembly .create (wait = True , resumable = False )
433+ with self .assertRaises (RuntimeError ):
434+ await assembly .create (wait = True , resumable = False )
439435
440- self .assertIs (response , plain_response )
441- self .assertEqual (response .data , "plain assembly response" )
442436 post_mock .assert_awaited_once ()
443437 get_mock .assert_awaited_once_with (
444438 assembly_url = f"{ self .server .base_url } /assemblies/assembly-123"
@@ -988,10 +982,18 @@ async def test_async_assembly_wait_returns_last_poll_response_when_budget_exhaus
988982
989983 self .assertEqual (response .data ["error" ], "RATE_LIMIT_REACHED" )
990984 post_mock .assert_awaited_once ()
991- get_mock .assert_awaited_once_with (
992- assembly_url = f"{ self .server .base_url } /assemblies/assembly-123"
985+ self .assertEqual (
986+ get_mock .await_args_list ,
987+ [
988+ mock .call (
989+ assembly_url = f"{ self .server .base_url } /assemblies/assembly-123"
990+ ),
991+ mock .call (
992+ assembly_url = f"{ self .server .base_url } /assemblies/assembly-123"
993+ ),
994+ ],
993995 )
994- self .assertEqual (sleep_mock .await_args_list , [mock .call (0 )])
996+ self .assertEqual (sleep_mock .await_args_list , [mock .call (0 ), mock . call ( 0 ) ])
995997
996998 async def test_async_assembly_non_resumable_rate_limit_rewinds_files_for_retry (self ):
997999 reads = []
@@ -1066,6 +1068,25 @@ async def test_async_request_uses_connect_and_read_timeouts_for_uploads(self):
10661068 self .assertIsNone (timeout .sock_read )
10671069 self .assertEqual (session .calls [0 ][1 ]["data" ]._fields [2 ][1 ]["Content-Type" ], "image/jpeg" )
10681070
1071+ async def test_async_request_filters_none_and_lowercases_booleans_in_extra_data (self ):
1072+ session = _RecordingSession ({"ok" : "ASSEMBLY_COMPLETED" })
1073+ client = AsyncTransloadit ("key" , "secret" , service = self .server .base_url , session = session )
1074+ upload = io .BytesIO (b"payload" )
1075+ upload .name = "clip.jpg"
1076+
1077+ response = await client .request .post (
1078+ "/assemblies" ,
1079+ data = {"foo" : "bar" },
1080+ extra_data = {"enabled" : True , "skip" : None },
1081+ files = {"file" : upload },
1082+ )
1083+
1084+ self .assertEqual (response .data ["ok" ], "ASSEMBLY_COMPLETED" )
1085+ fields = {field [0 ]["name" ]: field for field in session .calls [0 ][1 ]["data" ]._fields }
1086+ self .assertIn ("enabled" , fields )
1087+ self .assertNotIn ("skip" , fields )
1088+ self .assertEqual (fields ["enabled" ][2 ], "true" )
1089+
10691090 async def test_async_request_uses_filename_fallback_for_trailing_slash_stream_name (self ):
10701091 session = _RecordingSession ({"ok" : "ASSEMBLY_COMPLETED" })
10711092 client = AsyncTransloadit ("key" , "secret" , service = self .server .base_url , session = session )
0 commit comments