|
- package helper
-
- import (
- "bytes"
- "mime/multipart"
- "net/http"
- "net/http/httptest"
- "strings"
- "testing"
-
- "github.com/QuantumNous/new-api/types"
- "github.com/gin-gonic/gin"
- "github.com/stretchr/testify/require"
- )
-
- func TestDimensionResolver_JSONBody(t *testing.T) {
- c := newPricingJSONContext(`{"resolution":"720P","duration":"10","options":{"size":"1280x720"},"image_url":"https://example.test/a.png"}`)
-
- resolver, err := NewDimensionResolver(c)
- require.NoError(t, err)
-
- values, err := resolver.ResolveDimensions([]types.PricingDimension{
- {Key: "resolution", Source: "request.resolution", Type: "string"},
- {Key: "size", Source: "request.options.size", Type: "string"},
- {Key: "duration", Source: "request.duration", Type: "number"},
- {Key: "mode", Source: "derived.input_mode", Type: "string"},
- })
- require.NoError(t, err)
-
- require.Equal(t, "720P", values.Values["resolution"])
- require.Equal(t, "1280x720", values.Values["size"])
- require.Equal(t, 10.0, values.Values["duration"])
- require.Equal(t, "i2v", values.Values["mode"])
- require.Empty(t, values.Missing)
- }
-
- func TestDimensionResolver_DerivedInputModePriority(t *testing.T) {
- c := newPricingJSONContext(`{"image_url":"https://example.test/a.png","video_url":"https://example.test/a.mp4"}`)
- resolver, err := NewDimensionResolver(c)
- require.NoError(t, err)
-
- values, err := resolver.ResolveDimensions([]types.PricingDimension{
- {Key: "mode", Source: "derived.input_mode", Type: "string"},
- })
- require.NoError(t, err)
- require.Equal(t, "v2v", values.Values["mode"])
- }
-
- func TestDimensionResolver_DerivedVideoInputFromMetadataContent(t *testing.T) {
- c := newPricingJSONContext(`{
- "model":"seedance-2",
- "prompt":"test",
- "metadata":{
- "content":[
- {"type":"video_url","video_url":{"url":"https://example.test/input.mp4"}}
- ]
- }
- }`)
- resolver, err := NewDimensionResolver(c)
- require.NoError(t, err)
-
- values, err := resolver.ResolveDimensions([]types.PricingDimension{
- {Key: "video_input", Source: "derived.video_input", Type: "boolean"},
- })
- require.NoError(t, err)
- require.Equal(t, true, values.Values["video_input"])
- }
-
- func TestDimensionResolver_MissingRequiredValue(t *testing.T) {
- c := newPricingJSONContext(`{"resolution":"720P"}`)
- resolver, err := NewDimensionResolver(c)
- require.NoError(t, err)
-
- values, err := resolver.ResolveDimensions([]types.PricingDimension{
- {Key: "duration", Source: "request.duration", Type: "number"},
- })
- require.NoError(t, err)
- require.True(t, values.Missing["duration"])
- require.Nil(t, values.Values["duration"])
- }
-
- func TestDimensionResolver_OptionalDefault(t *testing.T) {
- c := newPricingJSONContext(`{"resolution":"720P"}`)
- resolver, err := NewDimensionResolver(c)
- require.NoError(t, err)
-
- values, err := resolver.ResolveDimensions([]types.PricingDimension{
- {Key: "duration", Source: "request.duration", Type: "number", Optional: true, Default: 5.0},
- })
- require.NoError(t, err)
- require.Equal(t, 5.0, values.Values["duration"])
- require.Empty(t, values.Missing)
- }
-
- func TestDimensionResolver_MultipartFileInputMode(t *testing.T) {
- body := &bytes.Buffer{}
- writer := multipart.NewWriter(body)
- require.NoError(t, writer.WriteField("resolution", "720P"))
- part, err := writer.CreateFormFile("image", "frame.png")
- require.NoError(t, err)
- _, err = part.Write([]byte("fake"))
- require.NoError(t, err)
- require.NoError(t, writer.Close())
-
- c := newPricingContext(body.String(), writer.FormDataContentType())
- resolver, err := NewDimensionResolver(c)
- require.NoError(t, err)
-
- values, err := resolver.ResolveDimensions([]types.PricingDimension{
- {Key: "resolution", Source: "request.resolution", Type: "string"},
- {Key: "mode", Source: "derived.input_mode", Type: "string"},
- })
- require.NoError(t, err)
- require.Equal(t, "720P", values.Values["resolution"])
- require.Equal(t, "i2v", values.Values["mode"])
- }
-
- func TestDimensionResolver_UnsupportedContentType(t *testing.T) {
- c := newPricingContext("resolution=720P", "application/x-www-form-urlencoded")
- _, err := NewDimensionResolver(c)
- require.ErrorContains(t, err, "unsupported content-type")
- }
-
- func TestDimensionResolver_ResponseSourceUnsupported(t *testing.T) {
- c := newPricingJSONContext(`{"resolution":"720P"}`)
- resolver, err := NewDimensionResolver(c)
- require.NoError(t, err)
-
- _, err = resolver.ResolveDimensions([]types.PricingDimension{
- {Key: "tokens", Source: "response.usage.total_tokens", Type: "number"},
- })
- require.ErrorContains(t, err, "unsupported in schema v1")
- }
-
- func newPricingJSONContext(body string) *gin.Context {
- return newPricingContext(body, "application/json")
- }
-
- func newPricingContext(body string, contentType string) *gin.Context {
- gin.SetMode(gin.TestMode)
- w := httptest.NewRecorder()
- c, _ := gin.CreateTestContext(w)
- req, _ := http.NewRequest(http.MethodPost, "/v1/video", strings.NewReader(body))
- req.Header.Set("Content-Type", contentType)
- c.Request = req
- return c
- }
|