feat(points): 增加双边积分与虚拟积分商城
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
package pointsmall
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"hfb_sys/backend/internal/database"
|
||||
"hfb_sys/backend/internal/model"
|
||||
)
|
||||
|
||||
func TestRedeemDeductsAvailablePointsAndStock(t *testing.T) {
|
||||
db := database.NewTestDB()
|
||||
user := model.User{Phone: "13900009601", PointsAvailable: 500}
|
||||
if err := db.Create(&user).Error; err != nil {
|
||||
t.Fatalf("create user failed: %v", err)
|
||||
}
|
||||
product := model.PointsMallProduct{
|
||||
Title: "测试兑换码",
|
||||
Description: "测试商品",
|
||||
RedemptionInstructions: "联系客服领取",
|
||||
PointsPrice: 100,
|
||||
Stock: 2,
|
||||
PerUserLimit: 2,
|
||||
Status: "online",
|
||||
}
|
||||
if err := db.Create(&product).Error; err != nil {
|
||||
t.Fatalf("create product failed: %v", err)
|
||||
}
|
||||
repo := NewRepository(db)
|
||||
redemption, err := repo.Redeem(t.Context(), user.ID, product.ID, 2)
|
||||
if err != nil {
|
||||
t.Fatalf("redeem failed: %v", err)
|
||||
}
|
||||
if redemption.TotalPoints != 200 {
|
||||
t.Fatalf("total points = %d, want 200", redemption.TotalPoints)
|
||||
}
|
||||
var savedUser model.User
|
||||
if err := db.First(&savedUser, user.ID).Error; err != nil {
|
||||
t.Fatalf("find user failed: %v", err)
|
||||
}
|
||||
if savedUser.PointsAvailable != 300 || savedUser.RenterGrowthPoints != 0 {
|
||||
t.Fatalf("points after redeem = available %d lifetime %d", savedUser.PointsAvailable, savedUser.RenterGrowthPoints)
|
||||
}
|
||||
var savedProduct model.PointsMallProduct
|
||||
if err := db.First(&savedProduct, product.ID).Error; err != nil {
|
||||
t.Fatalf("find product failed: %v", err)
|
||||
}
|
||||
if savedProduct.Stock != 0 || savedProduct.RedeemedCount != 2 {
|
||||
t.Fatalf("product stock/redeemed = %d/%d", savedProduct.Stock, savedProduct.RedeemedCount)
|
||||
}
|
||||
if _, err := repo.Redeem(t.Context(), user.ID, product.ID, 1); !errors.Is(err, ErrRedeemLimitExceeded) && !errors.Is(err, ErrProductUnavailable) {
|
||||
t.Fatalf("repeat redeem error = %v, want limit or unavailable", err)
|
||||
}
|
||||
completed, err := repo.CompleteRedemption(t.Context(), 99, redemption.ID, "已发放")
|
||||
if err != nil {
|
||||
t.Fatalf("complete redemption failed: %v", err)
|
||||
}
|
||||
if completed.Status != "completed" {
|
||||
t.Fatalf("redemption status = %s, want completed", completed.Status)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user