Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

148 строки
4.8 KiB

  1. package helper
  2. import (
  3. "bytes"
  4. "mime/multipart"
  5. "net/http"
  6. "net/http/httptest"
  7. "strings"
  8. "testing"
  9. "github.com/QuantumNous/new-api/types"
  10. "github.com/gin-gonic/gin"
  11. "github.com/stretchr/testify/require"
  12. )
  13. func TestDimensionResolver_JSONBody(t *testing.T) {
  14. c := newPricingJSONContext(`{"resolution":"720P","duration":"10","options":{"size":"1280x720"},"image_url":"https://example.test/a.png"}`)
  15. resolver, err := NewDimensionResolver(c)
  16. require.NoError(t, err)
  17. values, err := resolver.ResolveDimensions([]types.PricingDimension{
  18. {Key: "resolution", Source: "request.resolution", Type: "string"},
  19. {Key: "size", Source: "request.options.size", Type: "string"},
  20. {Key: "duration", Source: "request.duration", Type: "number"},
  21. {Key: "mode", Source: "derived.input_mode", Type: "string"},
  22. })
  23. require.NoError(t, err)
  24. require.Equal(t, "720P", values.Values["resolution"])
  25. require.Equal(t, "1280x720", values.Values["size"])
  26. require.Equal(t, 10.0, values.Values["duration"])
  27. require.Equal(t, "i2v", values.Values["mode"])
  28. require.Empty(t, values.Missing)
  29. }
  30. func TestDimensionResolver_DerivedInputModePriority(t *testing.T) {
  31. c := newPricingJSONContext(`{"image_url":"https://example.test/a.png","video_url":"https://example.test/a.mp4"}`)
  32. resolver, err := NewDimensionResolver(c)
  33. require.NoError(t, err)
  34. values, err := resolver.ResolveDimensions([]types.PricingDimension{
  35. {Key: "mode", Source: "derived.input_mode", Type: "string"},
  36. })
  37. require.NoError(t, err)
  38. require.Equal(t, "v2v", values.Values["mode"])
  39. }
  40. func TestDimensionResolver_DerivedVideoInputFromMetadataContent(t *testing.T) {
  41. c := newPricingJSONContext(`{
  42. "model":"seedance-2",
  43. "prompt":"test",
  44. "metadata":{
  45. "content":[
  46. {"type":"video_url","video_url":{"url":"https://example.test/input.mp4"}}
  47. ]
  48. }
  49. }`)
  50. resolver, err := NewDimensionResolver(c)
  51. require.NoError(t, err)
  52. values, err := resolver.ResolveDimensions([]types.PricingDimension{
  53. {Key: "video_input", Source: "derived.video_input", Type: "boolean"},
  54. })
  55. require.NoError(t, err)
  56. require.Equal(t, true, values.Values["video_input"])
  57. }
  58. func TestDimensionResolver_MissingRequiredValue(t *testing.T) {
  59. c := newPricingJSONContext(`{"resolution":"720P"}`)
  60. resolver, err := NewDimensionResolver(c)
  61. require.NoError(t, err)
  62. values, err := resolver.ResolveDimensions([]types.PricingDimension{
  63. {Key: "duration", Source: "request.duration", Type: "number"},
  64. })
  65. require.NoError(t, err)
  66. require.True(t, values.Missing["duration"])
  67. require.Nil(t, values.Values["duration"])
  68. }
  69. func TestDimensionResolver_OptionalDefault(t *testing.T) {
  70. c := newPricingJSONContext(`{"resolution":"720P"}`)
  71. resolver, err := NewDimensionResolver(c)
  72. require.NoError(t, err)
  73. values, err := resolver.ResolveDimensions([]types.PricingDimension{
  74. {Key: "duration", Source: "request.duration", Type: "number", Optional: true, Default: 5.0},
  75. })
  76. require.NoError(t, err)
  77. require.Equal(t, 5.0, values.Values["duration"])
  78. require.Empty(t, values.Missing)
  79. }
  80. func TestDimensionResolver_MultipartFileInputMode(t *testing.T) {
  81. body := &bytes.Buffer{}
  82. writer := multipart.NewWriter(body)
  83. require.NoError(t, writer.WriteField("resolution", "720P"))
  84. part, err := writer.CreateFormFile("image", "frame.png")
  85. require.NoError(t, err)
  86. _, err = part.Write([]byte("fake"))
  87. require.NoError(t, err)
  88. require.NoError(t, writer.Close())
  89. c := newPricingContext(body.String(), writer.FormDataContentType())
  90. resolver, err := NewDimensionResolver(c)
  91. require.NoError(t, err)
  92. values, err := resolver.ResolveDimensions([]types.PricingDimension{
  93. {Key: "resolution", Source: "request.resolution", Type: "string"},
  94. {Key: "mode", Source: "derived.input_mode", Type: "string"},
  95. })
  96. require.NoError(t, err)
  97. require.Equal(t, "720P", values.Values["resolution"])
  98. require.Equal(t, "i2v", values.Values["mode"])
  99. }
  100. func TestDimensionResolver_UnsupportedContentType(t *testing.T) {
  101. c := newPricingContext("resolution=720P", "application/x-www-form-urlencoded")
  102. _, err := NewDimensionResolver(c)
  103. require.ErrorContains(t, err, "unsupported content-type")
  104. }
  105. func TestDimensionResolver_ResponseSourceUnsupported(t *testing.T) {
  106. c := newPricingJSONContext(`{"resolution":"720P"}`)
  107. resolver, err := NewDimensionResolver(c)
  108. require.NoError(t, err)
  109. _, err = resolver.ResolveDimensions([]types.PricingDimension{
  110. {Key: "tokens", Source: "response.usage.total_tokens", Type: "number"},
  111. })
  112. require.ErrorContains(t, err, "unsupported in schema v1")
  113. }
  114. func newPricingJSONContext(body string) *gin.Context {
  115. return newPricingContext(body, "application/json")
  116. }
  117. func newPricingContext(body string, contentType string) *gin.Context {
  118. gin.SetMode(gin.TestMode)
  119. w := httptest.NewRecorder()
  120. c, _ := gin.CreateTestContext(w)
  121. req, _ := http.NewRequest(http.MethodPost, "/v1/video", strings.NewReader(body))
  122. req.Header.Set("Content-Type", contentType)
  123. c.Request = req
  124. return c
  125. }