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