| 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) | |
| } | |
| }) | |
| } | |
| } | |