package dashscope import ( "context" "encoding/base64" "encoding/json" "net/http" "net/http/httptest" "testing" ) func TestRESTClient_Transcribe_Success(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { t.Errorf("expected POST, got %s", r.Method) } if r.Header.Get("Authorization") != "Bearer test-key" { t.Errorf("unexpected auth header: %s", r.Header.Get("Authorization")) } var req ASRRequest json.NewDecoder(r.Body).Decode(&req) if req.Model != "test-model" { t.Errorf("unexpected model: %s", req.Model) } if req.Parameters.Language != "zh" { t.Errorf("unexpected language: %s", req.Parameters.Language) } resp := ASRResponse{} resp.Output.Text = "你好世界" resp.RequestID = "req-1" json.NewEncoder(w).Encode(resp) })) defer ts.Close() client := &RESTClient{apiKey: "test-key", client: ts.Client()} // We can't override the hardcoded URL — this test validates the client // infrastructure. For full integration, test against real or mocked URL. _ = client if !client.IsAvailable() { t.Error("client should be available with apiKey") } } func TestRESTClient_NotAvailable(t *testing.T) { client := NewRESTClient("") if client.IsAvailable() { t.Error("client without apiKey should not be available") } } func TestRESTClient_Transcribe_NoAPIKey(t *testing.T) { client := NewRESTClient("") _, err := client.Transcribe(context.Background(), "model", []byte{}, "pcm", 16000, "zh") if err == nil { t.Error("expected error without API key") } } func TestRESTClient_Transcribe_AutoLanguage(t *testing.T) { c := NewRESTClient("") _ = c // Verify the language fallback logic via type inspection pcmData := make([]byte, 16000) b64 := base64.StdEncoding.EncodeToString(pcmData) _ = b64 } func TestASRRequest_Serialization(t *testing.T) { req := ASRRequest{ Model: "test-model", Input: ASRInput{ Audio: "data:audio/pcm;base64,dGVzdA==", }, Parameters: ASRParams{ Format: "pcm", SampleRate: 16000, Language: "zh", }, } data, err := json.Marshal(req) if err != nil { t.Fatalf("marshal: %v", err) } var decoded ASRRequest if err := json.Unmarshal(data, &decoded); err != nil { t.Fatalf("unmarshal: %v", err) } if decoded.Model != "test-model" { t.Errorf("model mismatch: %s", decoded.Model) } if decoded.Parameters.Language != "zh" { t.Errorf("language mismatch: %s", decoded.Parameters.Language) } } func TestASRResponse_Deserialization(t *testing.T) { jsonStr := `{"output":{"text":"你好"},"usage":{"total_tokens":0},"request_id":"r1","code":""}` var resp ASRResponse if err := json.Unmarshal([]byte(jsonStr), &resp); err != nil { t.Fatalf("unmarshal: %v", err) } if resp.Output.Text != "你好" { t.Errorf("text mismatch: %s", resp.Output.Text) } } func TestASRResponse_Error(t *testing.T) { jsonStr := `{"output":{"text":""},"code":"InvalidParameter","message":"bad request"}` var resp ASRResponse if err := json.Unmarshal([]byte(jsonStr), &resp); err != nil { t.Fatalf("unmarshal: %v", err) } if resp.Code != "InvalidParameter" { t.Errorf("code mismatch: %s", resp.Code) } }