Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

107 rindas
4.7 KiB

  1. package service
  2. import (
  3. "context"
  4. "net/http"
  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/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. )
  12. type fakeAssetAdapter struct {
  13. name string
  14. operation AssetOperation
  15. statusCode int
  16. }
  17. func (a fakeAssetAdapter) Name() string {
  18. return a.name
  19. }
  20. func (a fakeAssetAdapter) Supports(op AssetOperation) bool {
  21. return a.operation == op
  22. }
  23. func (a fakeAssetAdapter) DoAssetRequest(context.Context, *model.Channel, AssetRequest) (*AssetUpstreamResponse, *AssetError) {
  24. return &AssetUpstreamResponse{StatusCode: a.statusCode, Body: []byte(`{"ok":true}`)}, nil
  25. }
  26. func TestResolveAssetChannelAutoMatchesOnlyRegisteredOperation(t *testing.T) {
  27. db := setupDoubaoAssetChannelDB(t)
  28. resetAssetAdapterRegistryForTest(t)
  29. RegisterAssetAdapterForTest(constant.ChannelTypeChinaMobileSeedance, fakeAssetAdapter{name: "cm", operation: AssetOperationAssetCreate, statusCode: http.StatusOK})
  30. createDoubaoAssetChannelForTest(t, db, 1, constant.ChannelTypeOpenAI, "default", "openai-key", common.ChannelStatusEnabled)
  31. createDoubaoAssetChannelForTest(t, db, 2, constant.ChannelTypeChinaMobileSeedance, "default", "cm-key", common.ChannelStatusEnabled)
  32. ch, adapter, assetErr := ResolveAssetChannelForOperation(10, "default", AssetOperationAssetCreate)
  33. require.Nil(t, assetErr)
  34. require.NotNil(t, ch)
  35. require.NotNil(t, adapter)
  36. assert.Equal(t, 2, ch.Id)
  37. assert.Equal(t, "cm", adapter.Name())
  38. }
  39. func TestResolveAssetChannelBoundUnsupportedOperationDoesNotFallback(t *testing.T) {
  40. db := setupDoubaoAssetChannelDB(t)
  41. resetAssetAdapterRegistryForTest(t)
  42. RegisterAssetAdapterForTest(constant.ChannelTypeChinaMobileSeedance, fakeAssetAdapter{name: "cm", operation: AssetOperationAssetCreate})
  43. RegisterAssetAdapterForTest(constant.ChannelTypeDoubaoVideoCompatibleAiping, fakeAssetAdapter{name: "aiping", operation: AssetOperationAssetGroupCreate})
  44. createDoubaoAssetChannelForTest(t, db, 1, constant.ChannelTypeChinaMobileSeedance, "default", "cm-key", common.ChannelStatusEnabled)
  45. createDoubaoAssetChannelForTest(t, db, 2, constant.ChannelTypeDoubaoVideoCompatibleAiping, "default", "aiping-key", common.ChannelStatusEnabled)
  46. require.NoError(t, model.BindUserAssetChannel(10, constant.ChannelTypeChinaMobileSeedance, "default", 1))
  47. ch, adapter, assetErr := ResolveAssetChannelForOperation(10, "default", AssetOperationAssetGroupCreate)
  48. assert.Nil(t, ch)
  49. assert.Nil(t, adapter)
  50. require.NotNil(t, assetErr)
  51. assert.Equal(t, AssetErrorOperationNotSupported, assetErr.Type)
  52. }
  53. func TestResolveAssetChannelIgnoresBindingFromUnrelatedFamily(t *testing.T) {
  54. db := setupDoubaoAssetChannelDB(t)
  55. resetAssetAdapterRegistryForTest(t)
  56. RegisterAssetAdapterForTest(constant.ChannelTypeChinaMobileSeedance, fakeAssetAdapter{name: "cm", operation: AssetOperationAssetCreate})
  57. createDoubaoAssetChannelForTest(t, db, 1, constant.ChannelTypeKlingAiping, "default", "kling-key", common.ChannelStatusEnabled)
  58. createDoubaoAssetChannelForTest(t, db, 2, constant.ChannelTypeChinaMobileSeedance, "default", "cm-key", common.ChannelStatusEnabled)
  59. require.NoError(t, model.BindUserAssetChannel(10, constant.ChannelTypeKlingAiping, "default", 1))
  60. ch, adapter, assetErr := ResolveAssetChannelForOperation(10, "default", AssetOperationAssetCreate)
  61. require.Nil(t, assetErr)
  62. require.NotNil(t, ch)
  63. require.NotNil(t, adapter)
  64. assert.Equal(t, 2, ch.Id)
  65. }
  66. func TestResolveAssetChannelAutoMatchDoesNotReplaceVideoBinding(t *testing.T) {
  67. db := setupDoubaoAssetChannelDB(t)
  68. resetAssetAdapterRegistryForTest(t)
  69. RegisterAssetAdapterForTest(constant.ChannelTypeChinaMobileSeedance, fakeAssetAdapter{name: "cm", operation: AssetOperationAssetGroupCreate})
  70. createDoubaoAssetChannelForTest(t, db, 1, constant.ChannelTypeKlingAiping, "default", "kling-key", common.ChannelStatusEnabled)
  71. createDoubaoAssetChannelForTest(t, db, 2, constant.ChannelTypeChinaMobileSeedance, "default", "cm-key", common.ChannelStatusEnabled)
  72. require.NoError(t, model.BindUserAssetChannel(10, constant.ChannelTypeKlingAiping, "default", 1))
  73. ch, _, assetErr := ResolveAssetChannelForOperation(10, "default", AssetOperationAssetGroupCreate)
  74. require.Nil(t, assetErr)
  75. require.NotNil(t, ch)
  76. assert.Equal(t, 2, ch.Id)
  77. binding, err := model.GetUserAssetChannel(10, constant.ChannelTypeKlingAiping, "default")
  78. require.NoError(t, err)
  79. require.NotNil(t, binding)
  80. assert.Equal(t, 1, binding.ChannelId)
  81. }
  82. func TestCompatibleAssetAdapterSupportsOnlyDeclaredOperations(t *testing.T) {
  83. adapter := NewCompatibleAssetAdapter("aiping_asset", []AssetOperation{AssetOperationAssetCreate})
  84. assert.True(t, adapter.Supports(AssetOperationAssetCreate))
  85. assert.False(t, adapter.Supports(AssetOperationAssetGroupCreate))
  86. }