//go:build unit package admin import ( "bytes" "fmt" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/require" ) // 回归分组平台枚举:kimi/zhipu/deepseek 必须能通过 Create/Update 的 binding 校验 // (历史 bug:调度/路由链路已支持 CN 平台分组,但 oneof 白名单漏加三平台,导致 // 平台分组无法创建、CN 账号"无可用分组");非法值仍须被拒。 func bindGroupPlatformJSON(t *testing.T, target any, body string) error { t.Helper() gin.SetMode(gin.TestMode) c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("POST", "/", bytes.NewBufferString(body)) c.Request.Header.Set("Content-Type", "application/json") return c.ShouldBindJSON(target) } func TestGroupPlatformBinding_AllowedPlatforms(t *testing.T) { allowed := []string{ "anthropic", "openai", "gemini", "antigravity", "grok", "kimi", "zhipu", "deepseek", "composite", } for _, platform := range allowed { t.Run("create_"+platform, func(t *testing.T) { var req CreateGroupRequest body := fmt.Sprintf(`{"name":"g","platform":%q}`, platform) require.NoError(t, bindGroupPlatformJSON(t, &req, body), "platform %q 应通过 CreateGroupRequest 校验", platform) require.Equal(t, platform, req.Platform) }) t.Run("update_"+platform, func(t *testing.T) { var req UpdateGroupRequest body := fmt.Sprintf(`{"platform":%q}`, platform) require.NoError(t, bindGroupPlatformJSON(t, &req, body), "platform %q 应通过 UpdateGroupRequest 校验", platform) require.Equal(t, platform, req.Platform) }) } } func TestGroupPlatformBinding_RejectsInvalidPlatforms(t *testing.T) { invalid := []string{ "moonshot", // 厂商别名,不是平台标识 "Kimi", // 大小写敏感 "openai ", // 尾随空格 "glm", "bogus", } for _, platform := range invalid { t.Run("create_"+platform, func(t *testing.T) { var req CreateGroupRequest body := fmt.Sprintf(`{"name":"g","platform":%q}`, platform) require.Error(t, bindGroupPlatformJSON(t, &req, body), "platform %q 应被 CreateGroupRequest 拒绝", platform) }) t.Run("update_"+platform, func(t *testing.T) { var req UpdateGroupRequest body := fmt.Sprintf(`{"platform":%q}`, platform) require.Error(t, bindGroupPlatformJSON(t, &req, body), "platform %q 应被 UpdateGroupRequest 拒绝", platform) }) } } func TestCompositeRouteTargetPlatform_AllowsCNProviders(t *testing.T) { for _, platform := range []string{"kimi", "zhipu", "deepseek"} { var req CompositeRouteRequest body := fmt.Sprintf(`{"public_model":"m","target_platform":%q}`, platform) require.NoError(t, bindGroupPlatformJSON(t, &req, body)) require.Equal(t, platform, req.TargetPlatform) } }