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