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