feat: 更新服务方法,显式接受用户ID参数,简化上下文调用
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"testing"
|
||||
|
||||
@@ -52,25 +51,40 @@ func (s *OrderTestSuite) Test_PurchaseFlow() {
|
||||
creator := &models.User{Username: "creator", Phone: "13800000001"}
|
||||
models.UserQuery.WithContext(ctx).Create(creator)
|
||||
// Tenant
|
||||
tenant := &models.Tenant{UserID: creator.ID, Name: "Music Shop", Code: "shop1", Status: consts.TenantStatusVerified}
|
||||
tenant := &models.Tenant{
|
||||
UserID: creator.ID,
|
||||
Name: "Music Shop",
|
||||
Code: "shop1",
|
||||
Status: consts.TenantStatusVerified,
|
||||
}
|
||||
models.TenantQuery.WithContext(ctx).Create(tenant)
|
||||
// Content
|
||||
content := &models.Content{TenantID: tenant.ID, UserID: creator.ID, Title: "Song A", Status: consts.ContentStatusPublished}
|
||||
content := &models.Content{
|
||||
TenantID: tenant.ID,
|
||||
UserID: creator.ID,
|
||||
Title: "Song A",
|
||||
Status: consts.ContentStatusPublished,
|
||||
}
|
||||
models.ContentQuery.WithContext(ctx).Create(content)
|
||||
// Price (10.00 CNY = 1000 cents)
|
||||
price := &models.ContentPrice{TenantID: tenant.ID, ContentID: content.ID, PriceAmount: 1000, Currency: consts.CurrencyCNY}
|
||||
price := &models.ContentPrice{
|
||||
TenantID: tenant.ID,
|
||||
ContentID: content.ID,
|
||||
PriceAmount: 1000,
|
||||
Currency: consts.CurrencyCNY,
|
||||
}
|
||||
models.ContentPriceQuery.WithContext(ctx).Create(price)
|
||||
|
||||
// Buyer
|
||||
buyer := &models.User{Username: "buyer", Phone: "13900000001", Balance: 2000} // Has 20.00
|
||||
models.UserQuery.WithContext(ctx).Create(buyer)
|
||||
|
||||
buyerCtx := context.WithValue(ctx, consts.CtxKeyUser, buyer.ID)
|
||||
// buyerCtx := context.WithValue(ctx, consts.CtxKeyUser, buyer.ID)
|
||||
|
||||
Convey("should create and pay order successfully", func() {
|
||||
// Step 1: Create Order
|
||||
form := &order_dto.OrderCreateForm{ContentID: cast.ToString(content.ID)}
|
||||
createRes, err := Order.Create(buyerCtx, form)
|
||||
createRes, err := Order.Create(ctx, buyer.ID, form)
|
||||
So(err, ShouldBeNil)
|
||||
So(createRes.OrderID, ShouldNotBeEmpty)
|
||||
|
||||
@@ -82,7 +96,7 @@ func (s *OrderTestSuite) Test_PurchaseFlow() {
|
||||
|
||||
// Step 2: Pay Order
|
||||
payForm := &order_dto.OrderPayForm{Method: "balance"}
|
||||
_, err = Order.Pay(buyerCtx, createRes.OrderID, payForm)
|
||||
_, err = Order.Pay(ctx, buyer.ID, createRes.OrderID, payForm)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Verify Order Paid
|
||||
@@ -95,7 +109,9 @@ func (s *OrderTestSuite) Test_PurchaseFlow() {
|
||||
So(b.Balance, ShouldEqual, 1000) // 2000 - 1000
|
||||
|
||||
// Verify Access Granted
|
||||
access, _ := models.ContentAccessQuery.WithContext(ctx).Where(models.ContentAccessQuery.UserID.Eq(buyer.ID), models.ContentAccessQuery.ContentID.Eq(content.ID)).First()
|
||||
access, _ := models.ContentAccessQuery.WithContext(ctx).
|
||||
Where(models.ContentAccessQuery.UserID.Eq(buyer.ID), models.ContentAccessQuery.ContentID.Eq(content.ID)).
|
||||
First()
|
||||
So(access, ShouldNotBeNil)
|
||||
So(access.Status, ShouldEqual, consts.ContentAccessStatusActive)
|
||||
|
||||
@@ -110,14 +126,16 @@ func (s *OrderTestSuite) Test_PurchaseFlow() {
|
||||
|
||||
Convey("should fail pay if insufficient balance", func() {
|
||||
// Set balance to 5.00
|
||||
models.UserQuery.WithContext(ctx).Where(models.UserQuery.ID.Eq(buyer.ID)).Update(models.UserQuery.Balance, 500)
|
||||
models.UserQuery.WithContext(ctx).
|
||||
Where(models.UserQuery.ID.Eq(buyer.ID)).
|
||||
Update(models.UserQuery.Balance, 500)
|
||||
|
||||
form := &order_dto.OrderCreateForm{ContentID: cast.ToString(content.ID)}
|
||||
createRes, err := Order.Create(buyerCtx, form)
|
||||
createRes, err := Order.Create(ctx, buyer.ID, form)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
payForm := &order_dto.OrderPayForm{Method: "balance"}
|
||||
_, err = Order.Pay(buyerCtx, createRes.OrderID, payForm)
|
||||
_, err = Order.Pay(ctx, buyer.ID, createRes.OrderID, payForm)
|
||||
So(err, ShouldNotBeNil)
|
||||
// Error should be QuotaExceeded or similar
|
||||
})
|
||||
@@ -127,10 +145,19 @@ func (s *OrderTestSuite) Test_PurchaseFlow() {
|
||||
func (s *OrderTestSuite) Test_OrderDetails() {
|
||||
Convey("Order Details", s.T(), func() {
|
||||
ctx := s.T().Context()
|
||||
database.Truncate(ctx, s.DB,
|
||||
models.TableNameOrder, models.TableNameOrderItem, models.TableNameUser,
|
||||
models.TableNameContent, models.TableNameContentPrice, models.TableNameTenant,
|
||||
models.TableNameContentAccess, models.TableNameTenantLedger, models.TableNameMediaAsset, models.TableNameContentAsset,
|
||||
database.Truncate(
|
||||
ctx,
|
||||
s.DB,
|
||||
models.TableNameOrder,
|
||||
models.TableNameOrderItem,
|
||||
models.TableNameUser,
|
||||
models.TableNameContent,
|
||||
models.TableNameContentPrice,
|
||||
models.TableNameTenant,
|
||||
models.TableNameContentAccess,
|
||||
models.TableNameTenantLedger,
|
||||
models.TableNameMediaAsset,
|
||||
models.TableNameContentAsset,
|
||||
)
|
||||
|
||||
// Setup
|
||||
@@ -138,28 +165,48 @@ func (s *OrderTestSuite) Test_OrderDetails() {
|
||||
models.UserQuery.WithContext(ctx).Create(creator)
|
||||
tenant := &models.Tenant{UserID: creator.ID, Name: "Best Shop", Status: consts.TenantStatusVerified}
|
||||
models.TenantQuery.WithContext(ctx).Create(tenant)
|
||||
content := &models.Content{TenantID: tenant.ID, UserID: creator.ID, Title: "Amazing Song", Status: consts.ContentStatusPublished}
|
||||
content := &models.Content{
|
||||
TenantID: tenant.ID,
|
||||
UserID: creator.ID,
|
||||
Title: "Amazing Song",
|
||||
Status: consts.ContentStatusPublished,
|
||||
}
|
||||
models.ContentQuery.WithContext(ctx).Create(content)
|
||||
price := &models.ContentPrice{TenantID: tenant.ID, ContentID: content.ID, PriceAmount: 500, Currency: consts.CurrencyCNY}
|
||||
price := &models.ContentPrice{
|
||||
TenantID: tenant.ID,
|
||||
ContentID: content.ID,
|
||||
PriceAmount: 500,
|
||||
Currency: consts.CurrencyCNY,
|
||||
}
|
||||
models.ContentPriceQuery.WithContext(ctx).Create(price)
|
||||
|
||||
// Asset (Cover)
|
||||
asset := &models.MediaAsset{TenantID: tenant.ID, UserID: creator.ID, Type: consts.MediaAssetTypeImage, ObjectKey: "cover.jpg"}
|
||||
asset := &models.MediaAsset{
|
||||
TenantID: tenant.ID,
|
||||
UserID: creator.ID,
|
||||
Type: consts.MediaAssetTypeImage,
|
||||
ObjectKey: "cover.jpg",
|
||||
}
|
||||
models.MediaAssetQuery.WithContext(ctx).Create(asset)
|
||||
models.ContentAssetQuery.WithContext(ctx).Create(&models.ContentAsset{ContentID: content.ID, AssetID: asset.ID, Role: consts.ContentAssetRoleCover})
|
||||
models.ContentAssetQuery.WithContext(ctx).
|
||||
Create(&models.ContentAsset{ContentID: content.ID, AssetID: asset.ID, Role: consts.ContentAssetRoleCover})
|
||||
|
||||
// Buyer
|
||||
buyer := &models.User{Username: "buyer2", Phone: "13900000002", Balance: 1000}
|
||||
models.UserQuery.WithContext(ctx).Create(buyer)
|
||||
buyerCtx := context.WithValue(ctx, consts.CtxKeyUser, buyer.ID)
|
||||
// buyerCtx := context.WithValue(ctx, consts.CtxKeyUser, buyer.ID)
|
||||
|
||||
Convey("should get full order details", func() {
|
||||
// Create & Pay
|
||||
createRes, _ := Order.Create(buyerCtx, &order_dto.OrderCreateForm{ContentID: cast.ToString(content.ID)})
|
||||
Order.Pay(buyerCtx, createRes.OrderID, &order_dto.OrderPayForm{Method: "balance"})
|
||||
createRes, _ := Order.Create(
|
||||
ctx,
|
||||
buyer.ID,
|
||||
&order_dto.OrderCreateForm{ContentID: cast.ToString(content.ID)},
|
||||
)
|
||||
Order.Pay(ctx, buyer.ID, createRes.OrderID, &order_dto.OrderPayForm{Method: "balance"})
|
||||
|
||||
// Get Detail
|
||||
detail, err := Order.GetUserOrder(buyerCtx, createRes.OrderID)
|
||||
detail, err := Order.GetUserOrder(ctx, buyer.ID, createRes.OrderID)
|
||||
So(err, ShouldBeNil)
|
||||
So(detail.TenantName, ShouldEqual, "Best Shop")
|
||||
So(len(detail.Items), ShouldEqual, 1)
|
||||
@@ -173,7 +220,16 @@ 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)
|
||||
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}
|
||||
@@ -184,7 +240,7 @@ func (s *OrderTestSuite) Test_PlatformCommission() {
|
||||
// Buyer
|
||||
buyer := &models.User{Username: "buyer_c", Balance: 2000}
|
||||
models.UserQuery.WithContext(ctx).Create(buyer)
|
||||
buyerCtx := context.WithValue(ctx, consts.CtxKeyUser, buyer.ID)
|
||||
// buyerCtx := context.WithValue(ctx, consts.CtxKeyUser, buyer.ID)
|
||||
|
||||
// Order (10.00 CNY = 1000)
|
||||
o := &models.Order{
|
||||
@@ -198,7 +254,7 @@ func (s *OrderTestSuite) Test_PlatformCommission() {
|
||||
|
||||
Convey("should deduct 10% fee", func() {
|
||||
payForm := &order_dto.OrderPayForm{Method: "balance"}
|
||||
_, err := Order.Pay(buyerCtx, cast.ToString(o.ID), payForm)
|
||||
_, err := Order.Pay(ctx, buyer.ID, cast.ToString(o.ID), payForm)
|
||||
So(err, ShouldBeNil)
|
||||
|
||||
// Verify Creator Balance (1000 - 10% = 900)
|
||||
@@ -215,7 +271,16 @@ func (s *OrderTestSuite) Test_PlatformCommission() {
|
||||
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)
|
||||
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}
|
||||
|
||||
Reference in New Issue
Block a user