117 lines
3.5 KiB
Go
117 lines
3.5 KiB
Go
package order
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"hfb_sys/backend/internal/model"
|
|
smsnode "hfb_sys/backend/internal/modules/sms"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func seedHandoffAssistOrder(t *testing.T, db *gorm.DB, handoffMode string) (model.User, model.RentalOrder) {
|
|
t.Helper()
|
|
|
|
owner := model.User{Phone: "13800009001"}
|
|
renter := model.User{Phone: "13900009001"}
|
|
if err := db.Create(&owner).Error; err != nil {
|
|
t.Fatalf("创建号主失败: %v", err)
|
|
}
|
|
if err := db.Create(&renter).Error; err != nil {
|
|
t.Fatalf("创建租客失败: %v", err)
|
|
}
|
|
|
|
account := model.GameAccount{
|
|
OwnerID: owner.ID,
|
|
Status: accountStatusPublished,
|
|
ServerRegion: "国服",
|
|
LoginPlatform: "steam",
|
|
Title: "节点短信测试账号",
|
|
}
|
|
if err := db.Create(&account).Error; err != nil {
|
|
t.Fatalf("创建账号失败: %v", err)
|
|
}
|
|
|
|
listing := model.RentalListing{
|
|
ListingNo: "LST-SMS-NODE-001",
|
|
OwnerID: owner.ID,
|
|
AccountID: account.ID,
|
|
Status: listingStatusPublished,
|
|
ReviewStatus: listingReviewStatusApproved,
|
|
InTransaction: true,
|
|
PriceCent: 1000,
|
|
}
|
|
if handoffMode != "" {
|
|
listing.HandoffMode = handoffMode
|
|
}
|
|
if err := db.Create(&listing).Error; err != nil {
|
|
t.Fatalf("创建商品失败: %v", err)
|
|
}
|
|
|
|
order := model.RentalOrder{
|
|
OrderNo: "ORD-SMS-NODE-001",
|
|
ListingID: listing.ID,
|
|
AccountID: account.ID,
|
|
OwnerID: owner.ID,
|
|
RenterID: renter.ID,
|
|
RentAmountCent: 1000,
|
|
Status: orderStatusPendingPayment,
|
|
HandoffStatus: handoffStatusNone,
|
|
}
|
|
if handoffMode != "" {
|
|
// 代管判定读的是订单自己的交接模式,仅在商品上标记不会生效。
|
|
order.HandoffMode = handoffMode
|
|
}
|
|
if err := db.Create(&order).Error; err != nil {
|
|
t.Fatalf("创建订单失败: %v", err)
|
|
}
|
|
return owner, order
|
|
}
|
|
|
|
// 支付成功进入待交接时,必须给号主入队一条「需要辅助登录」短信(仅落库,不在此处发送)。
|
|
func TestConfirmPaidEnqueuesHandoffAssistSms(t *testing.T) {
|
|
db := setupOrderTestDB(t)
|
|
repo := NewRepository(db)
|
|
owner, order := seedHandoffAssistOrder(t, db, "")
|
|
|
|
if _, err := repo.ConfirmPaidFromChannelTx(db, order.ID); err != nil {
|
|
t.Fatalf("ConfirmPaidFromChannelTx() error = %v", err)
|
|
}
|
|
|
|
var row model.SmsMessage
|
|
if err := db.Where("node = ? AND biz_type = ? AND biz_id = ?",
|
|
smsnode.NodeOrderHandoffAssist, "order", order.ID).First(&row).Error; err != nil {
|
|
t.Fatalf("应给号主入队辅助登录短信, 查询失败: %v", err)
|
|
}
|
|
if row.UserID != owner.ID {
|
|
t.Fatalf("user_id = %d, want %d(收件人应是号主)", row.UserID, owner.ID)
|
|
}
|
|
if row.Phone != owner.Phone {
|
|
t.Fatalf("phone = %q, want %q", row.Phone, owner.Phone)
|
|
}
|
|
if row.Status != model.SmsStatusPending {
|
|
t.Fatalf("status = %q, want %q", row.Status, model.SmsStatusPending)
|
|
}
|
|
}
|
|
|
|
// 代管订单由客服提交交接说明,不触达号主,因此不应产生号主短信。
|
|
func TestConfirmPaidSkipsSmsForPlatformManagedOrder(t *testing.T) {
|
|
db := setupOrderTestDB(t)
|
|
repo := NewRepository(db)
|
|
_, order := seedHandoffAssistOrder(t, db, handoffModePlatform)
|
|
|
|
if _, err := repo.ConfirmPaidFromChannelTx(db, order.ID); err != nil {
|
|
t.Fatalf("ConfirmPaidFromChannelTx() error = %v", err)
|
|
}
|
|
|
|
var count int64
|
|
if err := db.Model(&model.SmsMessage{}).
|
|
Where("node = ? AND biz_id = ?", smsnode.NodeOrderHandoffAssist, order.ID).
|
|
Count(&count).Error; err != nil {
|
|
t.Fatalf("统计短信记录失败: %v", err)
|
|
}
|
|
if count != 0 {
|
|
t.Fatalf("代管订单不应给号主发短信, 实际 %d 条", count)
|
|
}
|
|
}
|