package handler import ( "net/http/httptest" "testing" middleware2 "github.com/Wei-Shaw/sub2api/internal/server/middleware" "github.com/Wei-Shaw/sub2api/internal/service" "github.com/gin-gonic/gin" "github.com/stretchr/testify/require" ) func TestCompositeTargetPlatformAllowedResolvesKnownAllowedModel(t *testing.T) { gin.SetMode(gin.TestMode) c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("POST", "/v1/embeddings", nil) apiKey := &service.APIKey{Group: &service.Group{Platform: service.PlatformComposite}} require.True(t, compositeTargetPlatformAllowed(c, apiKey, "text-embedding-3-large", service.PlatformOpenAI)) platform, ok := service.ResolvedTargetPlatformFromContext(c.Request.Context()) require.True(t, ok) require.Equal(t, service.PlatformOpenAI, platform) } func TestCompositeTargetPlatformAllowedRejectsWrongOrUnknownModel(t *testing.T) { gin.SetMode(gin.TestMode) for _, tc := range []struct { name string model string }{ {name: "wrong provider", model: "claude-sonnet-4-5"}, {name: "unknown provider", model: "llama-4-maverick"}, } { t.Run(tc.name, func(t *testing.T) { c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("POST", "/v1/embeddings", nil) apiKey := &service.APIKey{Group: &service.Group{Platform: service.PlatformComposite}} require.False(t, compositeTargetPlatformAllowed(c, apiKey, tc.model, service.PlatformOpenAI)) }) } } func TestCompositeTargetPlatformResolvedRejectsUnknownModel(t *testing.T) { gin.SetMode(gin.TestMode) c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("POST", "/v1/messages", nil) apiKey := &service.APIKey{Group: &service.Group{Platform: service.PlatformComposite}} require.False(t, compositeTargetPlatformResolved(c, apiKey, "llama-4-maverick")) _, ok := service.ResolvedTargetPlatformFromContext(c.Request.Context()) require.False(t, ok) } func TestCompositeTargetPlatformResolvedAllowsConcreteGroupWithoutResolution(t *testing.T) { gin.SetMode(gin.TestMode) c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("POST", "/v1/messages", nil) apiKey := &service.APIKey{Group: &service.Group{Platform: service.PlatformAnthropic}} require.True(t, compositeTargetPlatformResolved(c, apiKey, "llama-4-maverick")) } func TestClientRequestedModelUsesCompositePublicModel(t *testing.T) { gin.SetMode(gin.TestMode) c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("POST", "/v1/chat/completions", nil) c.Request = c.Request.WithContext(service.WithCompositeRouteDecision(c.Request.Context(), service.CompositeRouteDecision{ Matched: true, Source: service.CompositeRouteSourceExplicit, PublicModel: "public-alias", TargetPlatform: service.PlatformOpenAI, UpstreamModel: "gpt-5", })) input := buildContentModerationInput(c, nil, middleware2.AuthSubject{UserID: 42}, service.ContentModerationProtocolOpenAIChat, "gpt-5", nil) require.Equal(t, "public-alias", input.Model) require.Equal(t, service.PlatformOpenAI, input.Provider) fields := clientRequestedUsageFields(c, service.ChannelMappingResult{MappedModel: "gpt-5"}, "gpt-5", "gpt-5") require.Equal(t, "public-alias", fields.OriginalModel) require.Equal(t, "public-alias", fields.ChannelMappedModel) require.Equal(t, "public-alias\u2192gpt-5", fields.ModelMappingChain) }