Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 

128 righe
4.3 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_MissingRequiredValue(t *testing.T) {
  41. c := newPricingJSONContext(`{"resolution":"720P"}`)
  42. resolver, err := NewDimensionResolver(c)
  43. require.NoError(t, err)
  44. values, err := resolver.ResolveDimensions([]types.PricingDimension{
  45. {Key: "duration", Source: "request.duration", Type: "number"},
  46. })
  47. require.NoError(t, err)
  48. require.True(t, values.Missing["duration"])
  49. require.Nil(t, values.Values["duration"])
  50. }
  51. func TestDimensionResolver_OptionalDefault(t *testing.T) {
  52. c := newPricingJSONContext(`{"resolution":"720P"}`)
  53. resolver, err := NewDimensionResolver(c)
  54. require.NoError(t, err)
  55. values, err := resolver.ResolveDimensions([]types.PricingDimension{
  56. {Key: "duration", Source: "request.duration", Type: "number", Optional: true, Default: 5.0},
  57. })
  58. require.NoError(t, err)
  59. require.Equal(t, 5.0, values.Values["duration"])
  60. require.Empty(t, values.Missing)
  61. }
  62. func TestDimensionResolver_MultipartFileInputMode(t *testing.T) {
  63. body := &bytes.Buffer{}
  64. writer := multipart.NewWriter(body)
  65. require.NoError(t, writer.WriteField("resolution", "720P"))
  66. part, err := writer.CreateFormFile("image", "frame.png")
  67. require.NoError(t, err)
  68. _, err = part.Write([]byte("fake"))
  69. require.NoError(t, err)
  70. require.NoError(t, writer.Close())
  71. c := newPricingContext(body.String(), writer.FormDataContentType())
  72. resolver, err := NewDimensionResolver(c)
  73. require.NoError(t, err)
  74. values, err := resolver.ResolveDimensions([]types.PricingDimension{
  75. {Key: "resolution", Source: "request.resolution", Type: "string"},
  76. {Key: "mode", Source: "derived.input_mode", Type: "string"},
  77. })
  78. require.NoError(t, err)
  79. require.Equal(t, "720P", values.Values["resolution"])
  80. require.Equal(t, "i2v", values.Values["mode"])
  81. }
  82. func TestDimensionResolver_UnsupportedContentType(t *testing.T) {
  83. c := newPricingContext("resolution=720P", "application/x-www-form-urlencoded")
  84. _, err := NewDimensionResolver(c)
  85. require.ErrorContains(t, err, "unsupported content-type")
  86. }
  87. func TestDimensionResolver_ResponseSourceUnsupported(t *testing.T) {
  88. c := newPricingJSONContext(`{"resolution":"720P"}`)
  89. resolver, err := NewDimensionResolver(c)
  90. require.NoError(t, err)
  91. _, err = resolver.ResolveDimensions([]types.PricingDimension{
  92. {Key: "tokens", Source: "response.usage.total_tokens", Type: "number"},
  93. })
  94. require.ErrorContains(t, err, "unsupported in schema v1")
  95. }
  96. func newPricingJSONContext(body string) *gin.Context {
  97. return newPricingContext(body, "application/json")
  98. }
  99. func newPricingContext(body string, contentType string) *gin.Context {
  100. gin.SetMode(gin.TestMode)
  101. w := httptest.NewRecorder()
  102. c, _ := gin.CreateTestContext(w)
  103. req, _ := http.NewRequest(http.MethodPost, "/v1/video", strings.NewReader(body))
  104. req.Header.Set("Content-Type", contentType)
  105. c.Request = req
  106. return c
  107. }