| package amp | |
| import ( | |
| "bytes" | |
| "encoding/json" | |
| "net/http" | |
| "net/http/httptest" | |
| "net/http/httputil" | |
| "testing" | |
| "github.com/gin-gonic/gin" | |
| "github.com/router-for-me/CLIProxyAPI/v6/internal/config" | |
| "github.com/router-for-me/CLIProxyAPI/v6/internal/registry" | |
| ) | |
| func TestFallbackHandler_ModelMapping_PreservesThinkingSuffixAndRewritesResponse(t *testing.T) { | |
| gin.SetMode(gin.TestMode) | |
| reg := registry.GetGlobalRegistry() | |
| reg.RegisterClient("test-client-amp-fallback", "codex", []*registry.ModelInfo{ | |
| {ID: "test/gpt-5.2", OwnedBy: "openai", Type: "codex"}, | |
| }) | |
| defer reg.UnregisterClient("test-client-amp-fallback") | |
| mapper := NewModelMapper([]config.AmpModelMapping{ | |
| {From: "gpt-5.2", To: "test/gpt-5.2"}, | |
| }) | |
| fallback := NewFallbackHandlerWithMapper(func() *httputil.ReverseProxy { return nil }, mapper, nil) | |
| handler := func(c *gin.Context) { | |
| var req struct { | |
| Model string `json:"model"` | |
| } | |
| if err := c.ShouldBindJSON(&req); err != nil { | |
| c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) | |
| return | |
| } | |
| c.JSON(http.StatusOK, gin.H{ | |
| "model": req.Model, | |
| "seen_model": req.Model, | |
| }) | |
| } | |
| r := gin.New() | |
| r.POST("/chat/completions", fallback.WrapHandler(handler)) | |
| reqBody := []byte(`{"model":"gpt-5.2(xhigh)"}`) | |
| req := httptest.NewRequest(http.MethodPost, "/chat/completions", bytes.NewReader(reqBody)) | |
| req.Header.Set("Content-Type", "application/json") | |
| w := httptest.NewRecorder() | |
| r.ServeHTTP(w, req) | |
| if w.Code != http.StatusOK { | |
| t.Fatalf("Expected status 200, got %d", w.Code) | |
| } | |
| var resp struct { | |
| Model string `json:"model"` | |
| SeenModel string `json:"seen_model"` | |
| } | |
| if err := json.Unmarshal(w.Body.Bytes(), &resp); err != nil { | |
| t.Fatalf("Failed to parse response JSON: %v", err) | |
| } | |
| if resp.Model != "gpt-5.2(xhigh)" { | |
| t.Errorf("Expected response model gpt-5.2(xhigh), got %s", resp.Model) | |
| } | |
| if resp.SeenModel != "test/gpt-5.2(xhigh)" { | |
| t.Errorf("Expected handler to see test/gpt-5.2(xhigh), got %s", resp.SeenModel) | |
| } | |
| } | |