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ů.
 
 
 

94 řádky
3.9 KiB

  1. package service
  2. import (
  3. "net/http"
  4. "net/url"
  5. "strings"
  6. "testing"
  7. "github.com/QuantumNous/new-api/constant"
  8. "github.com/QuantumNous/new-api/model"
  9. "github.com/stretchr/testify/require"
  10. )
  11. func TestDoubaoVideoAssetAdapter_SupportsAllOperations(t *testing.T) {
  12. adapter := NewDoubaoVideoAssetAdapter()
  13. require.Equal(t, "doubao_video_asset", adapter.Name())
  14. for _, op := range []AssetOperation{
  15. AssetOperationAssetCreate,
  16. AssetOperationAssetList,
  17. AssetOperationAssetGet,
  18. AssetOperationAssetUpdate,
  19. AssetOperationAssetDelete,
  20. AssetOperationAssetGroupCreate,
  21. AssetOperationAssetGroupList,
  22. AssetOperationAssetGroupGet,
  23. AssetOperationAssetGroupUpdate,
  24. AssetOperationAssetGroupDelete,
  25. } {
  26. require.True(t, adapter.Supports(op), "operation %s should be supported", op)
  27. }
  28. }
  29. func TestBuildDoubaoVideoAssetURL(t *testing.T) {
  30. baseURL := "http://14.103.147.238:19220"
  31. channel := &model.Channel{Type: constant.ChannelTypeDoubaoVideo, BaseURL: &baseURL}
  32. rawURL, rawQuery, err := buildDoubaoVideoAssetURL(channel, "ListAssets", "")
  33. require.NoError(t, err)
  34. require.Equal(t, "Action=ListAssets&Version=2024-01-01", rawQuery)
  35. parsed, err := url.Parse(rawURL)
  36. require.NoError(t, err)
  37. require.Equal(t, "/openApi/portrait", parsed.Path)
  38. require.Equal(t, "Action=ListAssets&Version=2024-01-01", parsed.RawQuery)
  39. }
  40. func TestBuildDoubaoVideoAssetURL_DefaultBaseAndTrailingSlash(t *testing.T) {
  41. baseURL := "https://ark.cn-beijing.volces.com/"
  42. channel := &model.Channel{Type: constant.ChannelTypeDoubaoVideo, BaseURL: &baseURL}
  43. rawURL, _, err := buildDoubaoVideoAssetURL(channel, "CreateAsset", "2024-01-01")
  44. require.NoError(t, err)
  45. require.Equal(t, "https://ark.cn-beijing.volces.com/openApi/portrait?Action=CreateAsset&Version=2024-01-01", rawURL)
  46. }
  47. func TestSignDoubaoVideoAssetRequest_HeaderShape(t *testing.T) {
  48. req, err := http.NewRequest(http.MethodPost, "http://14.103.147.238:19220/openApi/portrait?Action=ListAssets&Version=2024-01-01", nil)
  49. require.NoError(t, err)
  50. signDoubaoVideoAssetRequest(req, "AK-test", "SK-test", []byte(`{"Filter":{"GroupType":"AIGC"}}`), "Action=ListAssets&Version=2024-01-01")
  51. auth := req.Header.Get("Authorization")
  52. require.True(t, strings.HasPrefix(auth, "HMAC-SHA256 Credential=AK-test/"), "got %s", auth)
  53. require.Contains(t, auth, "/cn-beijing/ark/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=")
  54. require.NotEmpty(t, req.Header.Get("X-Date"))
  55. require.Len(t, req.Header.Get("X-Date"), 16)
  56. require.Equal(t, "application/json", req.Header.Get("Content-Type"))
  57. // body hash header must be the hex sha256 of the raw body
  58. require.Regexp(t, `^[0-9a-f]{64}$`, req.Header.Get("X-Content-Sha256"))
  59. }
  60. // The signature must change when any signed input changes (body, key, date).
  61. func TestSignDoubaoVideoAssetRequest_DeterministicPerInputs(t *testing.T) {
  62. build := func(body string) string {
  63. req, _ := http.NewRequest(http.MethodPost, "http://h/openApi/portrait?Action=A&Version=2024-01-01", nil)
  64. signDoubaoVideoAssetRequest(req, "AK", "SK", []byte(body), "Action=A&Version=2024-01-01")
  65. return req.Header.Get("Authorization")
  66. }
  67. sig1 := build(`{"a":1}`)
  68. sig2 := build(`{"a":1}`)
  69. sig3 := build(`{"a":2}`)
  70. require.Equal(t, sig1[strings.Index(sig1, "Signature="):], sig2[strings.Index(sig2, "Signature="):])
  71. require.NotEqual(t, sig1[strings.Index(sig1, "Signature="):], sig3[strings.Index(sig3, "Signature="):])
  72. }
  73. func TestDoubaoVideoAssetAdapter_MissingCredential(t *testing.T) {
  74. db := setupDoubaoAssetChannelDB(t)
  75. require.NoError(t, db.AutoMigrate(&model.ChannelAssetCredential{}))
  76. adapter := NewDoubaoVideoAssetAdapter()
  77. channel := &model.Channel{Id: 999999, Type: constant.ChannelTypeDoubaoVideo}
  78. _, assetErr := adapter.DoAssetRequest(t.Context(), channel, AssetRequest{
  79. Action: AssetActionSpec{Action: "ListAssets", Operation: AssetOperationAssetList},
  80. RawBody: []byte(`{}`),
  81. })
  82. require.NotNil(t, assetErr)
  83. require.Contains(t, assetErr.Message, "AccessKey and SecretKey are required")
  84. }