Files
hfb_sys/backend/internal/modules/payment/quality_owner_payment_test.go
T
yml2213 98174c0e33 feat(quality-owner): 增加优质号主、极品专区与无忧租号保险
- 支持保证金余额支付、在线支付开通及后台手动设置审计
- 新增极品专区发布权限、赔付方案与保险结算费率快照
- 优化首页、商品卡和个人中心的优质号主身份展示
2026-11-04 15:04:35 +08:00

98 lines
3.3 KiB
Go

package payment
import (
"testing"
"time"
"hfb_sys/backend/internal/database"
"hfb_sys/backend/internal/model"
"hfb_sys/backend/internal/modules/qualityowner"
)
func TestConfirmQualityOwnerPaymentFreezesDepositAndIsIdempotent(t *testing.T) {
db := database.NewTestDB()
user := model.User{
Phone: "13900009401",
RealnameStatus: "verified",
Status: "active",
}
if err := db.Create(&user).Error; err != nil {
t.Fatalf("创建用户失败: %v", err)
}
if err := db.Create(&model.WalletAccount{
UserID: user.ID,
AvailableBalanceCent: 0,
Status: "active",
}).Error; err != nil {
t.Fatalf("创建钱包失败: %v", err)
}
payment := model.PaymentOrder{
PaymentNo: "PAYQUALITYOWNER01",
OrderID: 0,
OrderNo: "QOQUALITY",
BizID: user.ID,
UserID: user.ID,
Provider: "mock",
ThirdOrderID: "PAYQUALITYOWNER01",
AmountCent: 20_000,
BizType: qualityOwnerPayBizType,
Status: "paying",
}
if err := db.Create(&payment).Error; err != nil {
t.Fatalf("创建支付单失败: %v", err)
}
repo := NewRepository(db, nil, nil, WithQualityOwnerRepo(qualityowner.NewRepository(db)))
raw := map[string]string{"status": "2", "third_order_id": payment.ThirdOrderID}
if err := repo.confirmPaid(t.Context(), &payment, "2", time.Now(), raw, channelSourceMock); err != nil {
t.Fatalf("确认保证金支付失败: %v", err)
}
if err := repo.confirmPaid(t.Context(), &payment, "2", time.Now(), raw, channelSourceMock); err != nil {
t.Fatalf("重复确认保证金支付失败: %v", err)
}
var gotUser model.User
if err := db.First(&gotUser, user.ID).Error; err != nil {
t.Fatalf("读取用户失败: %v", err)
}
if gotUser.QualityOwnerStatus != qualityowner.StatusActive || gotUser.QualityOwnerDepositCent != 20_000 {
t.Fatalf("用户未开通优质号主: %+v", gotUser)
}
var account model.WalletAccount
if err := db.Where("user_id = ? AND distribution_site_id = 0", user.ID).First(&account).Error; err != nil {
t.Fatalf("读取钱包失败: %v", err)
}
if account.AvailableBalanceCent != 0 || account.FrozenBalanceCent != 20_000 {
t.Fatalf("保证金钱包余额不正确: %+v", account)
}
var ledgerCount int64
if err := db.Model(&model.WalletLedger{}).
Where("user_id = ? AND biz_type = ?", user.ID, "quality_owner_deposit").
Count(&ledgerCount).Error; err != nil {
t.Fatalf("统计保证金流水失败: %v", err)
}
if ledgerCount != 1 {
t.Fatalf("保证金流水条数 = %d, want 1", ledgerCount)
}
}
func TestNewQualityOwnerPaymentUsesBizIDAndMockCashier(t *testing.T) {
payment, err := newQualityOwnerPayment(88, 20_000, StartPaymentRequest{PayWay: "WXZF"}, runtimePaymentConfig{
Provider: "mock",
MerchantID: "mock-merchant",
PayWay: "WXZF",
JSPayFlag: "2",
})
if err != nil {
t.Fatalf("newQualityOwnerPayment() error = %v", err)
}
if payment.BizType != qualityOwnerPayBizType || payment.BizID != 88 || payment.UserID != 88 {
t.Fatalf("保证金支付单业务字段不正确: %+v", payment)
}
if payment.OrderID != 0 || payment.AmountCent != 20_000 {
t.Fatalf("保证金支付单订单/金额不正确: %+v", payment)
}
if payment.TDCode == "" || payment.ProviderOrderID == "" {
t.Fatalf("mock 支付单未生成收银台: %+v", payment)
}
}