@@ -896,6 +896,97 @@ func TestExtractJSONPath_ArrayOnNonArray(t *testing.T) {
896896 }
897897}
898898
899+ func TestExecuteAndPoll_RejectsBatch (t * testing.T ) {
900+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
901+ w .WriteHeader (http .StatusOK )
902+ // Create response returns multiple IDs (batch translation)
903+ _ , _ = w .Write ([]byte (`{"data":{"video_translation_ids":["id_1","id_2","id_3"]}}` ))
904+ }))
905+ defer srv .Close ()
906+
907+ c := New ("key" , WithBaseURL (srv .URL ), WithHTTPClient (srv .Client ()), WithMaxRetries (0 ))
908+
909+ spec := & command.Spec {
910+ Endpoint : "/v3/video-translations" ,
911+ Method : http .MethodPost ,
912+ BodyEncoding : "json" ,
913+ PollConfig : & command.PollConfig {
914+ StatusEndpoint : "/v3/video-translations/{video_translation_id}" ,
915+ StatusField : "data.status" ,
916+ TerminalOK : []string {"completed" },
917+ TerminalFail : []string {"failed" },
918+ IDField : "data.video_translation_ids.0" ,
919+ },
920+ }
921+
922+ _ , err := c .ExecuteAndPoll (context .Background (), spec , emptyInvocation (), PollOptions {
923+ BaseDelay : time .Millisecond ,
924+ MaxDelay : time .Millisecond ,
925+ })
926+ if err == nil {
927+ t .Fatal ("expected error, got nil" )
928+ }
929+
930+ var cliErr * clierrors.CLIError
931+ if ! errors .As (err , & cliErr ) {
932+ t .Fatalf ("expected *CLIError, got %T: %v" , err , err )
933+ }
934+ if cliErr .Code != "batch_not_supported" {
935+ t .Fatalf ("code = %q, want %q" , cliErr .Code , "batch_not_supported" )
936+ }
937+ if ! strings .Contains (cliErr .Message , "3 resources" ) {
938+ t .Fatalf ("message = %q, want mention of 3 resources" , cliErr .Message )
939+ }
940+ }
941+
942+ func TestExecuteAndPoll_SingleArrayElement_OK (t * testing.T ) {
943+ var statusCalls int
944+ srv := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
945+ switch r .URL .Path {
946+ case "/v3/video-translations" :
947+ w .WriteHeader (http .StatusOK )
948+ // Single-language: array with 1 element
949+ _ , _ = w .Write ([]byte (`{"data":{"video_translation_ids":["trans_123"]}}` ))
950+ case "/v3/video-translations/trans_123" :
951+ statusCalls ++
952+ w .WriteHeader (http .StatusOK )
953+ _ , _ = w .Write ([]byte (`{"data":{"id":"trans_123","status":"completed"}}` ))
954+ default :
955+ t .Fatalf ("unexpected path %s" , r .URL .Path )
956+ }
957+ }))
958+ defer srv .Close ()
959+
960+ c := New ("key" , WithBaseURL (srv .URL ), WithHTTPClient (srv .Client ()), WithMaxRetries (0 ))
961+
962+ spec := & command.Spec {
963+ Endpoint : "/v3/video-translations" ,
964+ Method : http .MethodPost ,
965+ BodyEncoding : "json" ,
966+ PollConfig : & command.PollConfig {
967+ StatusEndpoint : "/v3/video-translations/{video_translation_id}" ,
968+ StatusField : "data.status" ,
969+ TerminalOK : []string {"completed" },
970+ TerminalFail : []string {"failed" },
971+ IDField : "data.video_translation_ids.0" ,
972+ },
973+ }
974+
975+ result , err := c .ExecuteAndPoll (context .Background (), spec , emptyInvocation (), PollOptions {
976+ BaseDelay : time .Millisecond ,
977+ MaxDelay : time .Millisecond ,
978+ })
979+ if err != nil {
980+ t .Fatalf ("unexpected error: %v" , err )
981+ }
982+ if statusCalls != 1 {
983+ t .Fatalf ("statusCalls = %d, want 1" , statusCalls )
984+ }
985+ if ! strings .Contains (string (result ), "completed" ) {
986+ t .Fatalf ("result = %s, want completed" , result )
987+ }
988+ }
989+
899990func pollableVideoCreateSpec () * command.Spec {
900991 return & command.Spec {
901992 Endpoint : "/v3/videos" ,
0 commit comments