package main import ( "bytes" "encoding/json" "mime/multipart" "net/http" "net/http/httptest" "testing" "git.cin.su/m/Assistant/contracts/capability" "git.cin.su/m/Assistant/contracts/identity" ) func TestMultimodalUploadRequiresSessionAndProxiesLocalResult(t *testing.T) { core := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/v1/creator/sessions/current" || r.Header.Get("Authorization") != "Bearer session" { t.Fatalf("unexpected session request: %s %q", r.URL.Path, r.Header.Get("Authorization")) } _ = json.NewEncoder(w).Encode(identity.CreatorSession{ActorID: "actor", PrincipalID: "principal"}) })) defer core.Close() cognitive := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/v1/multimodal/transcribe" || r.Method != http.MethodPost { t.Fatalf("unexpected multimodal request: %s %s", r.Method, r.URL.Path) } _ = json.NewEncoder(w).Encode(capability.MultimodalResponse{Operation: capability.MultimodalTranscribe, Text: "локальный текст", Provider: "local-whisper", ObservedAt: 1}) })) defer cognitive.Close() handler, err := newHandler(core.URL, "http://continuity.invalid", "http://commit.invalid", core.Client(), cognitive.URL) if err != nil { t.Fatal(err) } denied := httptest.NewRecorder() handler.ServeHTTP(denied, httptest.NewRequest(http.MethodPost, "/api/multimodal/transcribe", bytes.NewReader(nil))) if denied.Code != http.StatusUnauthorized { t.Fatalf("unauthenticated upload status=%d", denied.Code) } body := &bytes.Buffer{} writer := multipart.NewWriter(body) part, err := writer.CreateFormFile("file", "voice.wav") if err != nil { t.Fatal(err) } _, _ = part.Write([]byte("audio")) if err := writer.Close(); err != nil { t.Fatal(err) } request := httptest.NewRequest(http.MethodPost, "/api/multimodal/transcribe", body) request.Header.Set("Authorization", "Bearer session") request.Header.Set("Content-Type", writer.FormDataContentType()) response := httptest.NewRecorder() handler.ServeHTTP(response, request) if response.Code != http.StatusOK || !bytes.Contains(response.Body.Bytes(), []byte("локальный текст")) { t.Fatalf("status=%d body=%s", response.Code, response.Body.String()) } }