feat: add order governance flags and reconciliation
This commit is contained in:
@@ -2,10 +2,12 @@ package services
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"quyun/v2/app/commands/testx"
|
||||
"quyun/v2/app/errorx"
|
||||
super_dto "quyun/v2/app/http/super/v1/dto"
|
||||
"quyun/v2/app/requests"
|
||||
"quyun/v2/database"
|
||||
@@ -597,3 +599,92 @@ func (s *SuperTestSuite) Test_ContentReview() {
|
||||
So(reloaded2.Status, ShouldEqual, consts.ContentStatusBlocked)
|
||||
})
|
||||
}
|
||||
|
||||
func (s *SuperTestSuite) Test_OrderGovernance() {
|
||||
Convey("OrderGovernance", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
database.Truncate(ctx, s.DB, models.TableNameOrder, models.TableNameAuditLog)
|
||||
|
||||
newOrder := func() *models.Order {
|
||||
o := &models.Order{
|
||||
TenantID: 1,
|
||||
UserID: 2,
|
||||
Type: consts.OrderTypeContentPurchase,
|
||||
Status: consts.OrderStatusPaid,
|
||||
AmountPaid: 100,
|
||||
}
|
||||
So(models.OrderQuery.WithContext(ctx).Create(o), ShouldBeNil)
|
||||
return o
|
||||
}
|
||||
|
||||
operatorID := int64(9001)
|
||||
|
||||
Convey("should require reason when flagging", func() {
|
||||
o := newOrder()
|
||||
err := Super.FlagOrder(ctx, operatorID, o.ID, &super_dto.SuperOrderFlagForm{
|
||||
IsFlagged: true,
|
||||
})
|
||||
So(err, ShouldNotBeNil)
|
||||
|
||||
var appErr *errorx.AppError
|
||||
So(errors.As(err, &appErr), ShouldBeTrue)
|
||||
So(appErr.Code, ShouldEqual, errorx.ErrBadRequest.Code)
|
||||
})
|
||||
|
||||
Convey("should flag and unflag order", func() {
|
||||
o := newOrder()
|
||||
reason := "支付回调异常"
|
||||
|
||||
So(Super.FlagOrder(ctx, operatorID, o.ID, &super_dto.SuperOrderFlagForm{
|
||||
IsFlagged: true,
|
||||
Reason: reason,
|
||||
}), ShouldBeNil)
|
||||
|
||||
reloaded, err := models.OrderQuery.WithContext(ctx).Where(models.OrderQuery.ID.Eq(o.ID)).First()
|
||||
So(err, ShouldBeNil)
|
||||
So(reloaded.IsFlagged, ShouldBeTrue)
|
||||
So(reloaded.FlagReason, ShouldEqual, reason)
|
||||
So(reloaded.FlaggedBy, ShouldEqual, operatorID)
|
||||
So(reloaded.FlaggedAt.IsZero(), ShouldBeFalse)
|
||||
|
||||
So(Super.FlagOrder(ctx, operatorID, o.ID, &super_dto.SuperOrderFlagForm{
|
||||
IsFlagged: false,
|
||||
}), ShouldBeNil)
|
||||
|
||||
reloaded, err = models.OrderQuery.WithContext(ctx).Where(models.OrderQuery.ID.Eq(o.ID)).First()
|
||||
So(err, ShouldBeNil)
|
||||
So(reloaded.IsFlagged, ShouldBeFalse)
|
||||
So(reloaded.FlagReason, ShouldEqual, "")
|
||||
So(reloaded.FlaggedBy, ShouldEqual, int64(0))
|
||||
So(reloaded.FlaggedAt.IsZero(), ShouldBeTrue)
|
||||
})
|
||||
|
||||
Convey("should reconcile and unreconcile order", func() {
|
||||
o := newOrder()
|
||||
note := "对账完成"
|
||||
|
||||
So(Super.ReconcileOrder(ctx, operatorID, o.ID, &super_dto.SuperOrderReconcileForm{
|
||||
IsReconciled: true,
|
||||
Note: note,
|
||||
}), ShouldBeNil)
|
||||
|
||||
reloaded, err := models.OrderQuery.WithContext(ctx).Where(models.OrderQuery.ID.Eq(o.ID)).First()
|
||||
So(err, ShouldBeNil)
|
||||
So(reloaded.IsReconciled, ShouldBeTrue)
|
||||
So(reloaded.ReconcileNote, ShouldEqual, note)
|
||||
So(reloaded.ReconciledBy, ShouldEqual, operatorID)
|
||||
So(reloaded.ReconciledAt.IsZero(), ShouldBeFalse)
|
||||
|
||||
So(Super.ReconcileOrder(ctx, operatorID, o.ID, &super_dto.SuperOrderReconcileForm{
|
||||
IsReconciled: false,
|
||||
}), ShouldBeNil)
|
||||
|
||||
reloaded, err = models.OrderQuery.WithContext(ctx).Where(models.OrderQuery.ID.Eq(o.ID)).First()
|
||||
So(err, ShouldBeNil)
|
||||
So(reloaded.IsReconciled, ShouldBeFalse)
|
||||
So(reloaded.ReconcileNote, ShouldEqual, "")
|
||||
So(reloaded.ReconciledBy, ShouldEqual, int64(0))
|
||||
So(reloaded.ReconciledAt.IsZero(), ShouldBeTrue)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user