49 lines
1.7 KiB
Go
49 lines
1.7 KiB
Go
package pay
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/wangjia/pangolin/server/internal/codes"
|
|
"github.com/wangjia/pangolin/server/internal/reward"
|
|
)
|
|
|
|
func TestSettle_FirstPaidGrantsReferralBonus(t *testing.T) {
|
|
h, db, _ := newWebhookRig(t) // 复用本包 rig;rig 里 seedUser(1)
|
|
seedUser(t, db, 2, "invitee-uuid") // 被邀请人 = 付费者
|
|
// 建 referral: inviter=1, invitee=2, 已 reg_rewarded
|
|
now := time.Now().UTC()
|
|
if _, err := db.Exec(`INSERT INTO referrals (inviter_id,invitee_id,status,reg_rewarded_at,created_at) VALUES (1,2,'reg_rewarded',?,?)`, now, now); err != nil {
|
|
t.Fatalf("seed referral: %v", err)
|
|
}
|
|
// 装 rewarder
|
|
g := codes.NewService(codes.NewStore(db), nil, 5, time.Hour)
|
|
rw := reward.NewService(db, reward.NewStore(db), g, reward.Config{RegDays: 3, PaidDays: 7, TgDays: 3, RegMonthlyCap: 10}, time.Now)
|
|
h.SetRewarder(rw)
|
|
|
|
// 触发 settle(照本包已有 webhook 测试构造 ev:invitee=2 的一笔 paid;biz_ref=其 uuid)
|
|
err := h.settle(context.Background(), &webhookEvent{
|
|
ProductBizCode: "pro_month", OutTradeNo: "ot-1", BizRef: "invitee-uuid",
|
|
Channel: "nezha", AmountMinor: 600, Currency: "CNY", PaidAt: now.Format(time.RFC3339),
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("settle: %v", err)
|
|
}
|
|
|
|
var status string
|
|
if err := db.QueryRow(`SELECT status FROM referrals WHERE invitee_id=2`).Scan(&status); err != nil {
|
|
t.Fatalf("query referral status: %v", err)
|
|
}
|
|
if status != "paid_rewarded" {
|
|
t.Fatalf("status=%q, want paid_rewarded", status)
|
|
}
|
|
var fp int
|
|
if err := db.QueryRow(`SELECT COUNT(*) FROM users WHERE id=2 AND first_paid_at IS NOT NULL`).Scan(&fp); err != nil {
|
|
t.Fatalf("query first_paid_at: %v", err)
|
|
}
|
|
if fp != 1 {
|
|
t.Fatalf("first_paid_at not set")
|
|
}
|
|
}
|