Files
hfb_sys/backend/internal/modules/order/sms_node_test.go
T

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)
}
}