package api import ( "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/ez-api/ez-api/internal/model" "github.com/gin-gonic/gin" ) func TestAdmin_TestProvider_OpenAICompatible(t *testing.T) { h, db := newTestHandler(t) upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/v1/models" { http.NotFound(w, r) return } if got := r.Header.Get("Authorization"); got != "Bearer k" { http.Error(w, "unauthorized", http.StatusUnauthorized) return } w.Header().Set("Content-Type", "application/json") _, _ = w.Write([]byte(`{"object":"list","data":[]}`)) })) defer upstream.Close() p := &model.Provider{ Name: "p1", Type: "openai", BaseURL: upstream.URL + "/v1", APIKey: "k", Group: "default", Models: "gpt-4o-mini", Status: "active", } if err := db.Create(p).Error; err != nil { t.Fatalf("create provider: %v", err) } r := gin.New() r.POST("/admin/providers/:id/test", h.TestProvider) req := httptest.NewRequest(http.MethodPost, "/admin/providers/1/test", nil) rr := httptest.NewRecorder() r.ServeHTTP(rr, req) if rr.Code != http.StatusOK { t.Fatalf("expected 200, got %d body=%s", rr.Code, rr.Body.String()) } var payload map[string]any if err := json.Unmarshal(rr.Body.Bytes(), &payload); err != nil { t.Fatalf("unmarshal: %v", err) } if ok, _ := payload["ok"].(bool); !ok { t.Fatalf("expected ok=true, got %v body=%s", payload["ok"], rr.Body.String()) } }