group_handler_platform_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. //go:build unit
  2. package admin
  3. import (
  4. "bytes"
  5. "fmt"
  6. "net/http/httptest"
  7. "testing"
  8. "github.com/gin-gonic/gin"
  9. "github.com/stretchr/testify/require"
  10. )
  11. // 回归分组平台枚举:kimi/zhipu/deepseek 必须能通过 Create/Update 的 binding 校验
  12. // (历史 bug:调度/路由链路已支持 CN 平台分组,但 oneof 白名单漏加三平台,导致
  13. // 平台分组无法创建、CN 账号"无可用分组");非法值仍须被拒。
  14. func bindGroupPlatformJSON(t *testing.T, target any, body string) error {
  15. t.Helper()
  16. gin.SetMode(gin.TestMode)
  17. c, _ := gin.CreateTestContext(httptest.NewRecorder())
  18. c.Request = httptest.NewRequest("POST", "/", bytes.NewBufferString(body))
  19. c.Request.Header.Set("Content-Type", "application/json")
  20. return c.ShouldBindJSON(target)
  21. }
  22. func TestGroupPlatformBinding_AllowedPlatforms(t *testing.T) {
  23. allowed := []string{
  24. "anthropic", "openai", "gemini", "antigravity", "grok",
  25. "kimi", "zhipu", "deepseek", "minimax", "composite",
  26. }
  27. for _, platform := range allowed {
  28. t.Run("create_"+platform, func(t *testing.T) {
  29. var req CreateGroupRequest
  30. body := fmt.Sprintf(`{"name":"g","platform":%q}`, platform)
  31. require.NoError(t, bindGroupPlatformJSON(t, &req, body),
  32. "platform %q 应通过 CreateGroupRequest 校验", platform)
  33. require.Equal(t, platform, req.Platform)
  34. })
  35. t.Run("update_"+platform, func(t *testing.T) {
  36. var req UpdateGroupRequest
  37. body := fmt.Sprintf(`{"platform":%q}`, platform)
  38. require.NoError(t, bindGroupPlatformJSON(t, &req, body),
  39. "platform %q 应通过 UpdateGroupRequest 校验", platform)
  40. require.Equal(t, platform, req.Platform)
  41. })
  42. }
  43. }
  44. func TestGroupPlatformBinding_RejectsInvalidPlatforms(t *testing.T) {
  45. invalid := []string{
  46. "moonshot", // 厂商别名,不是平台标识
  47. "Kimi", // 大小写敏感
  48. "openai ", // 尾随空格
  49. "glm",
  50. "bogus",
  51. }
  52. for _, platform := range invalid {
  53. t.Run("create_"+platform, func(t *testing.T) {
  54. var req CreateGroupRequest
  55. body := fmt.Sprintf(`{"name":"g","platform":%q}`, platform)
  56. require.Error(t, bindGroupPlatformJSON(t, &req, body),
  57. "platform %q 应被 CreateGroupRequest 拒绝", platform)
  58. })
  59. t.Run("update_"+platform, func(t *testing.T) {
  60. var req UpdateGroupRequest
  61. body := fmt.Sprintf(`{"platform":%q}`, platform)
  62. require.Error(t, bindGroupPlatformJSON(t, &req, body),
  63. "platform %q 应被 UpdateGroupRequest 拒绝", platform)
  64. })
  65. }
  66. }
  67. func TestCompositeRouteTargetPlatform_AllowsCNProviders(t *testing.T) {
  68. for _, platform := range []string{"kimi", "zhipu", "deepseek", "minimax"} {
  69. var req CompositeRouteRequest
  70. body := fmt.Sprintf(`{"public_model":"m","target_platform":%q}`, platform)
  71. require.NoError(t, bindGroupPlatformJSON(t, &req, body))
  72. require.Equal(t, platform, req.TargetPlatform)
  73. }
  74. }