Files
quyun-v2/backend/app/services/media_asset_test.go
Rogee 2cc823d3a8 feat: Introduce MediaAssetVariant for better asset management
- Added MediaAssetVariant enum with values 'main' and 'preview'.
- Updated media asset service logic to utilize MediaAssetVariant for variant handling.
- Refactored database models and queries to include variant and source_asset_id fields.
- Enhanced validation for asset variants in upload and processing functions.
- Updated Swagger documentation to reflect new variant structure and descriptions.
- Implemented necessary database migrations to support the new variant constraints.
2025-12-22 19:27:31 +08:00

112 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package services
import (
"database/sql"
"errors"
"testing"
"time"
"quyun/v2/app/commands/testx"
"quyun/v2/app/errorx"
tenant_dto "quyun/v2/app/http/tenant/dto"
"quyun/v2/database"
"quyun/v2/database/models"
"quyun/v2/pkg/consts"
. "github.com/smartystreets/goconvey/convey"
"github.com/stretchr/testify/suite"
_ "go.ipao.vip/atom"
"go.ipao.vip/atom/contracts"
"go.ipao.vip/gen/types"
"go.uber.org/dig"
)
type MediaAssetTestSuiteInjectParams struct {
dig.In
DB *sql.DB
Initials []contracts.Initial `group:"initials"` // nolint:structcheck
}
type MediaAssetTestSuite struct {
suite.Suite
MediaAssetTestSuiteInjectParams
}
func Test_MediaAsset(t *testing.T) {
providers := testx.Default().With(Provide)
testx.Serve(providers, t, func(p MediaAssetTestSuiteInjectParams) {
suite.Run(t, &MediaAssetTestSuite{MediaAssetTestSuiteInjectParams: p})
})
}
func (s *MediaAssetTestSuite) Test_AdminUploadInit_VariantAndSource() {
Convey("MediaAsset.AdminUploadInit variant/source_asset_id", s.T(), func() {
ctx := s.T().Context()
now := time.Now().UTC()
tenantID := int64(1)
userID := int64(2)
database.Truncate(ctx, s.DB, models.TableNameMediaAsset)
Convey("main variant 不允许 source_asset_id", func() {
src := int64(123)
v := consts.MediaAssetVariantMain
_, err := MediaAsset.AdminUploadInit(ctx, tenantID, userID, &tenant_dto.AdminMediaAssetUploadInitForm{
Type: "video",
Variant: &v,
SourceAssetID: &src,
}, now)
So(err, ShouldNotBeNil)
var appErr *errorx.AppError
So(errors.As(err, &appErr), ShouldBeTrue)
So(appErr.Code, ShouldEqual, errorx.ErrInvalidParameter.Code)
})
Convey("preview variant 必须带 source_asset_id", func() {
v := consts.MediaAssetVariantPreview
_, err := MediaAsset.AdminUploadInit(ctx, tenantID, userID, &tenant_dto.AdminMediaAssetUploadInitForm{
Type: "video",
Variant: &v,
}, now)
So(err, ShouldNotBeNil)
var appErr *errorx.AppError
So(errors.As(err, &appErr), ShouldBeTrue)
So(appErr.Code, ShouldEqual, errorx.ErrInvalidParameter.Code)
})
Convey("preview variant 的 source_asset_id 必须存在且为 main variant", func() {
src := &models.MediaAsset{
TenantID: tenantID,
UserID: userID,
Type: consts.MediaAssetTypeVideo,
Status: consts.MediaAssetStatusReady,
Provider: "test",
Bucket: "b",
ObjectKey: "k",
Meta: types.JSON([]byte("{}")),
CreatedAt: now,
UpdatedAt: now,
}
So(src.Create(ctx), ShouldBeNil)
// 将来源资源标记为 preview模拟“来源不是 main”的非法情况。
_, err := s.DB.ExecContext(ctx, "UPDATE media_assets SET variant = 'preview' WHERE tenant_id = $1 AND id = $2", tenantID, src.ID)
So(err, ShouldBeNil)
v := consts.MediaAssetVariantPreview
_, err = MediaAsset.AdminUploadInit(ctx, tenantID, userID, &tenant_dto.AdminMediaAssetUploadInitForm{
Type: "video",
Variant: &v,
SourceAssetID: &src.ID,
}, now)
So(err, ShouldNotBeNil)
var appErr *errorx.AppError
So(errors.As(err, &appErr), ShouldBeTrue)
So(appErr.Code, ShouldEqual, errorx.ErrPreconditionFailed.Code)
})
})
}