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