Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

104 řádky
3.3 KiB

  1. package controller
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "testing"
  6. "github.com/QuantumNous/new-api/common"
  7. "github.com/QuantumNous/new-api/constant"
  8. "github.com/QuantumNous/new-api/model"
  9. "github.com/gin-gonic/gin"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/require"
  12. )
  13. func setupDoubaoAssetProxyRouter(t *testing.T) *gin.Engine {
  14. t.Helper()
  15. oldMode := gin.Mode()
  16. gin.SetMode(gin.TestMode)
  17. t.Cleanup(func() {
  18. gin.SetMode(oldMode)
  19. })
  20. r := gin.New()
  21. r.POST("/api/v1/volcengine/asset", DoubaoAssetProxy)
  22. return r
  23. }
  24. func decodeDoubaoAssetErrorMessage(t *testing.T, body string) string {
  25. t.Helper()
  26. var payload struct {
  27. Error struct {
  28. Message string `json:"message"`
  29. Type string `json:"type"`
  30. } `json:"error"`
  31. }
  32. require.NoError(t, common.Unmarshal([]byte(body), &payload))
  33. return payload.Error.Message
  34. }
  35. func TestDoubaoAssetProxyMissingActionReturns400(t *testing.T) {
  36. router := setupDoubaoAssetProxyRouter(t)
  37. req := httptest.NewRequest(http.MethodPost, "/api/v1/volcengine/asset?Version=2024-01-01", nil)
  38. w := httptest.NewRecorder()
  39. router.ServeHTTP(w, req)
  40. assert.Equal(t, http.StatusBadRequest, w.Code)
  41. assert.Equal(t, "Action query parameter is required", decodeDoubaoAssetErrorMessage(t, w.Body.String()))
  42. }
  43. func TestDoubaoAssetProxyBlocksAssetGroupActionsCaseInsensitively(t *testing.T) {
  44. router := setupDoubaoAssetProxyRouter(t)
  45. for _, action := range []string{"CreateAssetGroup", "getassetgroup", "LISTASSETGROUPS", "UpdateAssetGroup", "deleteassetgroup"} {
  46. t.Run(action, func(t *testing.T) {
  47. req := httptest.NewRequest(http.MethodPost, "/api/v1/volcengine/asset?Action="+action, nil)
  48. w := httptest.NewRecorder()
  49. router.ServeHTTP(w, req)
  50. assert.Equal(t, http.StatusBadRequest, w.Code)
  51. assert.Contains(t, decodeDoubaoAssetErrorMessage(t, w.Body.String()), "Asset group API ("+action+") is not supported")
  52. })
  53. }
  54. }
  55. func TestBuildDoubaoAssetURLDefaultBaseAndEscapedQuery(t *testing.T) {
  56. got, err := buildDoubaoAssetURL(&model.Channel{}, "ApplyUploadInner&Space", "")
  57. require.NoError(t, err)
  58. assert.Equal(t, defaultDoubaoAssetBaseURL+"/api/v1/multimodal/sd/assets?Action=ApplyUploadInner%26Space&Version=2024-01-01", got)
  59. }
  60. func TestBuildDoubaoAssetURLExplicitBaseURLOverridesDefault(t *testing.T) {
  61. baseURL := "https://example.com/custom/"
  62. got, err := buildDoubaoAssetURL(&model.Channel{BaseURL: &baseURL}, "CommitUploadInner", "2025-02-03")
  63. require.NoError(t, err)
  64. assert.Equal(t, "https://example.com/custom/api/v1/multimodal/sd/assets?Action=CommitUploadInner&Version=2025-02-03", got)
  65. }
  66. func TestEffectiveDoubaoAssetGroupUsesUsingGroupBeforeBlankTokenGroup(t *testing.T) {
  67. c, _ := gin.CreateTestContext(httptest.NewRecorder())
  68. common.SetContextKey(c, constant.ContextKeyTokenGroup, "")
  69. common.SetContextKey(c, constant.ContextKeyUsingGroup, "default")
  70. assert.Equal(t, "default", effectiveDoubaoAssetGroup(c))
  71. }
  72. func TestConcreteDoubaoAssetGroupsForAutoUsesUserAutoGroups(t *testing.T) {
  73. c, _ := gin.CreateTestContext(httptest.NewRecorder())
  74. common.SetContextKey(c, constant.ContextKeyUsingGroup, "auto")
  75. common.SetContextKey(c, constant.ContextKeyTokenGroup, "")
  76. groups := concreteDoubaoAssetGroupsForRequest(c, func(string) []string {
  77. return []string{"default", "vip"}
  78. })
  79. assert.Equal(t, []string{"default", "vip"}, groups)
  80. }