| package api |
|
|
| import ( |
| "net/http" |
| "net/http/httptest" |
| "os" |
| "path/filepath" |
| "strings" |
| "testing" |
|
|
| gin "github.com/gin-gonic/gin" |
| proxyconfig "github.com/router-for-me/CLIProxyAPI/v6/internal/config" |
| sdkaccess "github.com/router-for-me/CLIProxyAPI/v6/sdk/access" |
| "github.com/router-for-me/CLIProxyAPI/v6/sdk/cliproxy/auth" |
| sdkconfig "github.com/router-for-me/CLIProxyAPI/v6/sdk/config" |
| ) |
|
|
| func newTestServer(t *testing.T) *Server { |
| t.Helper() |
|
|
| gin.SetMode(gin.TestMode) |
|
|
| tmpDir := t.TempDir() |
| authDir := filepath.Join(tmpDir, "auth") |
| if err := os.MkdirAll(authDir, 0o700); err != nil { |
| t.Fatalf("failed to create auth dir: %v", err) |
| } |
|
|
| cfg := &proxyconfig.Config{ |
| SDKConfig: sdkconfig.SDKConfig{ |
| APIKeys: []string{"test-key"}, |
| }, |
| Port: 0, |
| AuthDir: authDir, |
| Debug: true, |
| LoggingToFile: false, |
| UsageStatisticsEnabled: false, |
| } |
|
|
| authManager := auth.NewManager(nil, nil, nil) |
| accessManager := sdkaccess.NewManager() |
|
|
| configPath := filepath.Join(tmpDir, "config.yaml") |
| return NewServer(cfg, authManager, accessManager, configPath) |
| } |
|
|
| func TestAmpProviderModelRoutes(t *testing.T) { |
| testCases := []struct { |
| name string |
| path string |
| wantStatus int |
| wantContains string |
| }{ |
| { |
| name: "openai root models", |
| path: "/api/provider/openai/models", |
| wantStatus: http.StatusOK, |
| wantContains: `"object":"list"`, |
| }, |
| { |
| name: "groq root models", |
| path: "/api/provider/groq/models", |
| wantStatus: http.StatusOK, |
| wantContains: `"object":"list"`, |
| }, |
| { |
| name: "openai models", |
| path: "/api/provider/openai/v1/models", |
| wantStatus: http.StatusOK, |
| wantContains: `"object":"list"`, |
| }, |
| { |
| name: "anthropic models", |
| path: "/api/provider/anthropic/v1/models", |
| wantStatus: http.StatusOK, |
| wantContains: `"data"`, |
| }, |
| { |
| name: "google models v1", |
| path: "/api/provider/google/v1/models", |
| wantStatus: http.StatusOK, |
| wantContains: `"models"`, |
| }, |
| { |
| name: "google models v1beta", |
| path: "/api/provider/google/v1beta/models", |
| wantStatus: http.StatusOK, |
| wantContains: `"models"`, |
| }, |
| } |
|
|
| for _, tc := range testCases { |
| tc := tc |
| t.Run(tc.name, func(t *testing.T) { |
| server := newTestServer(t) |
|
|
| req := httptest.NewRequest(http.MethodGet, tc.path, nil) |
| req.Header.Set("Authorization", "Bearer test-key") |
|
|
| rr := httptest.NewRecorder() |
| server.engine.ServeHTTP(rr, req) |
|
|
| if rr.Code != tc.wantStatus { |
| t.Fatalf("unexpected status code for %s: got %d want %d; body=%s", tc.path, rr.Code, tc.wantStatus, rr.Body.String()) |
| } |
| if body := rr.Body.String(); !strings.Contains(body, tc.wantContains) { |
| t.Fatalf("response body for %s missing %q: %s", tc.path, tc.wantContains, body) |
| } |
| }) |
| } |
| } |
|
|