Spaces:
Paused
Paused
| package amp | |
| import ( | |
| "net/http" | |
| "net/http/httptest" | |
| "testing" | |
| "github.com/gin-gonic/gin" | |
| ) | |
| func TestCreateGeminiBridgeHandler_ActionParameterExtraction(t *testing.T) { | |
| gin.SetMode(gin.TestMode) | |
| tests := []struct { | |
| name string | |
| path string | |
| mappedModel string // empty string means no mapping | |
| expectedAction string | |
| }{ | |
| { | |
| name: "no_mapping_uses_url_model", | |
| path: "/publishers/google/models/gemini-pro:generateContent", | |
| mappedModel: "", | |
| expectedAction: "gemini-pro:generateContent", | |
| }, | |
| { | |
| name: "mapped_model_replaces_url_model", | |
| path: "/publishers/google/models/gemini-exp:generateContent", | |
| mappedModel: "gemini-2.0-flash", | |
| expectedAction: "gemini-2.0-flash:generateContent", | |
| }, | |
| { | |
| name: "mapping_preserves_method", | |
| path: "/publishers/google/models/gemini-2.5-preview:streamGenerateContent", | |
| mappedModel: "gemini-flash", | |
| expectedAction: "gemini-flash:streamGenerateContent", | |
| }, | |
| } | |
| for _, tt := range tests { | |
| t.Run(tt.name, func(t *testing.T) { | |
| var capturedAction string | |
| mockGeminiHandler := func(c *gin.Context) { | |
| capturedAction = c.Param("action") | |
| c.JSON(http.StatusOK, gin.H{"captured": capturedAction}) | |
| } | |
| // Use the actual createGeminiBridgeHandler function | |
| bridgeHandler := createGeminiBridgeHandler(mockGeminiHandler) | |
| r := gin.New() | |
| if tt.mappedModel != "" { | |
| r.Use(func(c *gin.Context) { | |
| c.Set(MappedModelContextKey, tt.mappedModel) | |
| c.Next() | |
| }) | |
| } | |
| r.POST("/api/provider/google/v1beta1/*path", bridgeHandler) | |
| req := httptest.NewRequest(http.MethodPost, "/api/provider/google/v1beta1"+tt.path, nil) | |
| w := httptest.NewRecorder() | |
| r.ServeHTTP(w, req) | |
| if w.Code != http.StatusOK { | |
| t.Fatalf("Expected status 200, got %d", w.Code) | |
| } | |
| if capturedAction != tt.expectedAction { | |
| t.Errorf("Expected action '%s', got '%s'", tt.expectedAction, capturedAction) | |
| } | |
| }) | |
| } | |
| } | |
| func TestCreateGeminiBridgeHandler_InvalidPath(t *testing.T) { | |
| gin.SetMode(gin.TestMode) | |
| mockHandler := func(c *gin.Context) { | |
| c.JSON(http.StatusOK, gin.H{"ok": true}) | |
| } | |
| bridgeHandler := createGeminiBridgeHandler(mockHandler) | |
| r := gin.New() | |
| r.POST("/api/provider/google/v1beta1/*path", bridgeHandler) | |
| req := httptest.NewRequest(http.MethodPost, "/api/provider/google/v1beta1/invalid/path", nil) | |
| w := httptest.NewRecorder() | |
| r.ServeHTTP(w, req) | |
| if w.Code != http.StatusBadRequest { | |
| t.Errorf("Expected status 400 for invalid path, got %d", w.Code) | |
| } | |
| } | |