86 lines
2.2 KiB
Go
86 lines
2.2 KiB
Go
package jobs
|
||
|
||
import (
|
||
"database/sql"
|
||
"testing"
|
||
"time"
|
||
|
||
"quyun/v2/app/commands/testx"
|
||
jobs_args "quyun/v2/app/jobs/args"
|
||
"quyun/v2/app/services"
|
||
"quyun/v2/database"
|
||
"quyun/v2/database/models"
|
||
"quyun/v2/pkg/consts"
|
||
|
||
"github.com/riverqueue/river"
|
||
"github.com/riverqueue/river/rivertype"
|
||
. "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 MediaAssetProcessJobSuiteInjectParams struct {
|
||
dig.In
|
||
|
||
DB *sql.DB
|
||
Initials []contracts.Initial `group:"initials"` // nolint:structcheck
|
||
}
|
||
|
||
type MediaAssetProcessJobSuite struct {
|
||
suite.Suite
|
||
MediaAssetProcessJobSuiteInjectParams
|
||
}
|
||
|
||
func Test_MediaAssetProcessJob(t *testing.T) {
|
||
// 注意:testx.Default() 已内置一个测试用的 job worker 注册器,避免和 jobs.Provide 重复注册同 kind worker。
|
||
providers := testx.Default().With(services.Provide)
|
||
|
||
testx.Serve(providers, t, func(p MediaAssetProcessJobSuiteInjectParams) {
|
||
suite.Run(t, &MediaAssetProcessJobSuite{MediaAssetProcessJobSuiteInjectParams: p})
|
||
})
|
||
}
|
||
|
||
func (s *MediaAssetProcessJobSuite) Test_Work_ProcessingToReady() {
|
||
Convey("MediaAssetProcessJobWorker processing -> ready", s.T(), func() {
|
||
ctx := s.T().Context()
|
||
now := time.Now().UTC()
|
||
tenantID := int64(1)
|
||
userID := int64(2)
|
||
|
||
database.Truncate(ctx, s.DB, models.TableNameMediaAsset)
|
||
|
||
asset := &models.MediaAsset{
|
||
TenantID: tenantID,
|
||
UserID: userID,
|
||
Type: consts.MediaAssetTypeVideo,
|
||
Status: consts.MediaAssetStatusProcessing,
|
||
Provider: "test",
|
||
Bucket: "b",
|
||
ObjectKey: "k",
|
||
Meta: types.JSON([]byte("{}")),
|
||
CreatedAt: now,
|
||
UpdatedAt: now,
|
||
}
|
||
So(asset.Create(ctx), ShouldBeNil)
|
||
|
||
worker := &MediaAssetProcessJobWorker{}
|
||
err := worker.Work(ctx, &river.Job[jobs_args.MediaAssetProcessJob]{
|
||
JobRow: &rivertype.JobRow{Attempt: 1},
|
||
Args: jobs_args.MediaAssetProcessJob{TenantID: tenantID, AssetID: asset.ID},
|
||
})
|
||
So(err, ShouldBeNil)
|
||
|
||
tbl, query := models.MediaAssetQuery.QueryContext(ctx)
|
||
got, err := query.Where(
|
||
tbl.TenantID.Eq(tenantID),
|
||
tbl.ID.Eq(asset.ID),
|
||
).First()
|
||
So(err, ShouldBeNil)
|
||
So(got.Status, ShouldEqual, consts.MediaAssetStatusReady)
|
||
})
|
||
}
|