package service import ( "testing" "github.com/QuantumNous/new-api/common" "github.com/QuantumNous/new-api/constant" "github.com/QuantumNous/new-api/model" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestGetBoundVideoAssetChannelForModelFindsSeedanceTianyiYunBinding(t *testing.T) { db := setupDoubaoAssetChannelDB(t) createDoubaoAssetChannelForTest(t, db, 16, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default", "key", common.ChannelStatusEnabled) createDoubaoAssetAbilityForTest(t, db, "default", "Doubao-Seedance-2.0", 16, true) require.NoError(t, model.BindUserAssetChannel(10, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default", 16)) ch, err := GetBoundVideoAssetChannelForModel(10, "default", "Doubao-Seedance-2.0", VideoAssetFamilySeedance) require.NoError(t, err) require.NotNil(t, ch) assert.Equal(t, 16, ch.Id) } func TestGetBoundVideoAssetChannelForModelFindsKlingBindingByFamily(t *testing.T) { db := setupDoubaoAssetChannelDB(t) createDoubaoAssetChannelForTest(t, db, 59, constant.ChannelTypeKlingAiping, "default", "key", common.ChannelStatusEnabled) createDoubaoAssetAbilityForTest(t, db, "default", "kling-v2-6", 59, true) require.NoError(t, model.BindUserAssetChannel(10, constant.ChannelTypeKlingAiping, "default", 59)) ch, err := GetBoundVideoAssetChannelForModel(10, "default", "kling-v2-6", VideoAssetFamilyKling) require.NoError(t, err) require.NotNil(t, ch) assert.Equal(t, 59, ch.Id) } func TestGetBoundVideoAssetChannelForModelRejectsBindingWithoutAbility(t *testing.T) { db := setupDoubaoAssetChannelDB(t) createDoubaoAssetChannelForTest(t, db, 16, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default", "key", common.ChannelStatusEnabled) require.NoError(t, model.BindUserAssetChannel(10, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default", 16)) ch, err := GetBoundVideoAssetChannelForModel(10, "default", "Doubao-Seedance-2.0", VideoAssetFamilySeedance) require.NoError(t, err) assert.Nil(t, ch) } func TestBindVideoAssetChannelReplacesOtherFamilyBindings(t *testing.T) { db := setupDoubaoAssetChannelDB(t) createDoubaoAssetChannelForTest(t, db, 7, constant.ChannelTypeDoubaoVideoCompatibleAiping, "default", "aiping-key", common.ChannelStatusEnabled) createDoubaoAssetChannelForTest(t, db, 16, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default", "tianyiyun-key", common.ChannelStatusEnabled) createDoubaoAssetAbilityForTest(t, db, "default", "Doubao-Seedance-2.0", 7, true) createDoubaoAssetAbilityForTest(t, db, "default", "Doubao-Seedance-2.0", 16, true) require.NoError(t, model.BindUserAssetChannel(10, constant.ChannelTypeDoubaoVideoCompatibleAiping, "default", 7)) selected, err := model.CacheGetChannel(16) require.NoError(t, err) require.NoError(t, BindVideoAssetChannel(10, "default", selected, VideoAssetFamilySeedance)) oldBinding, err := model.GetUserAssetChannel(10, constant.ChannelTypeDoubaoVideoCompatibleAiping, "default") require.NoError(t, err) assert.Nil(t, oldBinding) newBinding, err := model.GetUserAssetChannel(10, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default") require.NoError(t, err) require.NotNil(t, newBinding) assert.Equal(t, 16, newBinding.ChannelId) } func TestGetBoundVideoAssetChannelForModelPrefersLatestFamilyBindingForLegacyRows(t *testing.T) { db := setupDoubaoAssetChannelDB(t) createDoubaoAssetChannelForTest(t, db, 7, constant.ChannelTypeDoubaoVideoCompatibleAiping, "default", "aiping-key", common.ChannelStatusEnabled) createDoubaoAssetChannelForTest(t, db, 16, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default", "tianyiyun-key", common.ChannelStatusEnabled) createDoubaoAssetAbilityForTest(t, db, "default", "Doubao-Seedance-2.0", 7, true) createDoubaoAssetAbilityForTest(t, db, "default", "Doubao-Seedance-2.0", 16, true) require.NoError(t, model.BindUserAssetChannel(10, constant.ChannelTypeDoubaoVideoCompatibleAiping, "default", 7)) require.NoError(t, model.BindUserAssetChannel(10, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default", 16)) require.NoError(t, db.Model(&model.UserAssetChannel{}). Where("user_id = ? AND channel_type = ?", 10, constant.ChannelTypeDoubaoVideoCompatibleAiping). Update("updated_at", int64(100)).Error) require.NoError(t, db.Model(&model.UserAssetChannel{}). Where("user_id = ? AND channel_type = ?", 10, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun). Update("updated_at", int64(200)).Error) ch, err := GetBoundVideoAssetChannelForModel(10, "default", "Doubao-Seedance-2.0", VideoAssetFamilySeedance) require.NoError(t, err) require.NotNil(t, ch) assert.Equal(t, 16, ch.Id) } func TestResolveVideoAssetChannelForModelAutoSelectsAndPersistsFamilyBinding(t *testing.T) { db := setupDoubaoAssetChannelDB(t) createDoubaoAssetChannelForTest(t, db, 16, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default", "tianyiyun-key", common.ChannelStatusEnabled) createDoubaoAssetAbilityForTest(t, db, "default", "Doubao-Seedance-2.0", 16, true) ch, err := ResolveVideoAssetChannelForModel(10, "default", "Doubao-Seedance-2.0", VideoAssetFamilySeedance) require.NoError(t, err) require.NotNil(t, ch) assert.Equal(t, 16, ch.Id) binding, err := model.GetUserAssetChannel(10, constant.ChannelTypeDoubaoVideoCompatibleTianyiYun, "default") require.NoError(t, err) require.NotNil(t, binding) assert.Equal(t, 16, binding.ChannelId) }