feat: 实现平台抽成、提现审批、异步任务集成及安全审计功能
This commit is contained in:
@@ -104,7 +104,7 @@ func (s *OrderTestSuite) Test_PurchaseFlow() {
|
||||
l, _ := models.TenantLedgerQuery.WithContext(ctx).Where(models.TenantLedgerQuery.OrderID.Eq(o.ID)).First()
|
||||
So(l, ShouldNotBeNil)
|
||||
So(l.UserID, ShouldEqual, creator.ID)
|
||||
So(l.Amount, ShouldEqual, 1000)
|
||||
So(l.Amount, ShouldEqual, 900)
|
||||
So(l.Type, ShouldEqual, consts.TenantLedgerTypeDebitPurchase)
|
||||
})
|
||||
|
||||
@@ -169,3 +169,89 @@ func (s *OrderTestSuite) Test_OrderDetails() {
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func (s *OrderTestSuite) Test_PlatformCommission() {
|
||||
Convey("Platform Commission", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
database.Truncate(ctx, s.DB, models.TableNameUser, models.TableNameOrder, models.TableNameOrderItem, models.TableNameTenant, models.TableNameTenantLedger, models.TableNameContentAccess)
|
||||
|
||||
// Creator
|
||||
creator := &models.User{Username: "creator_c", Balance: 0}
|
||||
models.UserQuery.WithContext(ctx).Create(creator)
|
||||
// Tenant
|
||||
t := &models.Tenant{UserID: creator.ID, Name: "Shop C", Status: consts.TenantStatusVerified}
|
||||
models.TenantQuery.WithContext(ctx).Create(t)
|
||||
// Buyer
|
||||
buyer := &models.User{Username: "buyer_c", Balance: 2000}
|
||||
models.UserQuery.WithContext(ctx).Create(buyer)
|
||||
buyerCtx := context.WithValue(ctx, consts.CtxKeyUser, buyer.ID)
|
||||
|
||||
// Order (10.00 CNY = 1000)
|
||||
o := &models.Order{
|
||||
TenantID: t.ID,
|
||||
UserID: buyer.ID,
|
||||
AmountPaid: 1000,
|
||||
Status: consts.OrderStatusCreated,
|
||||
}
|
||||
models.OrderQuery.WithContext(ctx).Create(o)
|
||||
models.OrderItemQuery.WithContext(ctx).Create(&models.OrderItem{OrderID: o.ID, ContentID: 999}) // Fake content
|
||||
|
||||
Convey("should deduct 10% fee", func() {
|
||||
payForm := &order_dto.OrderPayForm{Method: "balance"}
|
||||
_, err := Order.Pay(buyerCtx, cast.ToString(o.ID), payForm)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Verify Creator Balance (1000 - 10% = 900)
|
||||
cReload, _ := models.UserQuery.WithContext(ctx).Where(models.UserQuery.ID.Eq(creator.ID)).First()
|
||||
So(cReload.Balance, ShouldEqual, 900)
|
||||
|
||||
// Verify Ledger
|
||||
l, _ := models.TenantLedgerQuery.WithContext(ctx).Where(models.TenantLedgerQuery.OrderID.Eq(o.ID)).First()
|
||||
So(l.Amount, ShouldEqual, 900)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func (s *OrderTestSuite) Test_ExternalPayment() {
|
||||
Convey("External Payment", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
database.Truncate(ctx, s.DB, models.TableNameUser, models.TableNameOrder, models.TableNameOrderItem, models.TableNameTenant, models.TableNameTenantLedger, models.TableNameContentAccess)
|
||||
|
||||
// Creator
|
||||
creator := &models.User{Username: "creator_ext", Balance: 0}
|
||||
models.UserQuery.WithContext(ctx).Create(creator)
|
||||
// Tenant
|
||||
t := &models.Tenant{UserID: creator.ID, Name: "Shop Ext", Status: consts.TenantStatusVerified}
|
||||
models.TenantQuery.WithContext(ctx).Create(t)
|
||||
// Buyer (Balance 0)
|
||||
buyer := &models.User{Username: "buyer_ext", Balance: 0}
|
||||
models.UserQuery.WithContext(ctx).Create(buyer)
|
||||
|
||||
// Order
|
||||
o := &models.Order{
|
||||
TenantID: t.ID,
|
||||
UserID: buyer.ID,
|
||||
AmountPaid: 1000,
|
||||
Status: consts.OrderStatusCreated,
|
||||
}
|
||||
models.OrderQuery.WithContext(ctx).Create(o)
|
||||
models.OrderItemQuery.WithContext(ctx).Create(&models.OrderItem{OrderID: o.ID, ContentID: 999})
|
||||
|
||||
Convey("should process external payment callback", func() {
|
||||
err := Order.ProcessExternalPayment(ctx, cast.ToString(o.ID), "ext_tx_id_123")
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Verify Status
|
||||
oReload, _ := models.OrderQuery.WithContext(ctx).Where(models.OrderQuery.ID.Eq(o.ID)).First()
|
||||
So(oReload.Status, ShouldEqual, consts.OrderStatusPaid)
|
||||
|
||||
// Verify Creator Credited
|
||||
cReload, _ := models.UserQuery.WithContext(ctx).Where(models.UserQuery.ID.Eq(creator.ID)).First()
|
||||
So(cReload.Balance, ShouldEqual, 900) // 1000 - 10%
|
||||
|
||||
// Verify Buyer Balance (Should NOT be deducted)
|
||||
bReload, _ := models.UserQuery.WithContext(ctx).Where(models.UserQuery.ID.Eq(buyer.ID)).First()
|
||||
So(bReload.Balance, ShouldEqual, 0)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user