98 lines
3.6 KiB
Go
98 lines
3.6 KiB
Go
package recharge
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
biz "kra/internal/biz/recharge"
|
|
"kra/internal/data/ledger"
|
|
|
|
"github.com/glebarez/sqlite"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type testProvider struct{ db *gorm.DB }
|
|
|
|
func (p testProvider) DB() *gorm.DB { return p.db }
|
|
|
|
func TestMarkPaidCreditsWalletOnlyOnce(t *testing.T) {
|
|
db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = db.AutoMigrate(&ledger.RechargeOrderPO{}, &ledger.WalletPO{}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = db.Exec(`CREATE TABLE sys_users (id integer primary key, username text, nick_name text)`).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = db.Exec(`INSERT INTO sys_users(id,username,nick_name) VALUES (3,'buyer','Buyer')`).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
order := ledger.RechargeOrderPO{OrderNo: "CZ-1", UserID: 3, Diamonds: 60, AmountCents: 600}
|
|
if err = db.Create(&order).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
repo := NewRepo(testProvider{db: db})
|
|
if _, err = repo.MarkPaid(context.Background(), order.OrderNo); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err = repo.MarkPaid(context.Background(), order.OrderNo); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var wallet ledger.WalletPO
|
|
if err = db.Where("user_id = ?", 3).First(&wallet).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if wallet.DiamondBalance != 60 || wallet.TotalRechargeCents != 600 {
|
|
t.Fatalf("wallet credited more than once: %+v", wallet)
|
|
}
|
|
}
|
|
|
|
func TestListReadsPaymentStateFromKRAOrders(t *testing.T) {
|
|
db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=shared"), &gorm.Config{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = db.AutoMigrate(&ledger.RechargeOrderPO{}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = db.Exec(`CREATE TABLE sys_users (id integer primary key, username text, nick_name text)`).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = db.Exec(`CREATE TABLE pay_orders (trade_no text, business_type text, business_id text, provider text, provider_trade_no text, payment_status text, fulfillment_status text, refund_status text)`).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = db.Exec(`INSERT INTO sys_users(id,username,nick_name) VALUES (3,'buyer','Buyer')`).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
creditedAt := time.Now()
|
|
order := ledger.RechargeOrderPO{OrderNo: "CZ-2", UserID: 3, Diamonds: 300, AmountCents: 3000, CreditedAt: &creditedAt}
|
|
if err = db.Create(&order).Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
repo := NewRepo(testProvider{db: db})
|
|
pending, err := repo.Get(context.Background(), order.OrderNo)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if pending.Provider != "" || pending.PaymentStatus != "" {
|
|
t.Fatalf("new business order unexpectedly has payment state: %+v", pending)
|
|
}
|
|
if err = db.Exec(`INSERT INTO pay_orders(trade_no,business_type,business_id,provider,provider_trade_no,payment_status,fulfillment_status,refund_status) VALUES (?,?,?,?,?,?,?,?)`, order.OrderNo, biz.BusinessType, order.OrderNo, "wechat-v3", "WX-1", "paid", "succeeded", "none").Error; err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
items, total, summary, err := repo.List(context.Background(), biz.Filter{Provider: "wechat-v3", PaymentStatus: "paid"}, biz.ListOptions{Limit: 10})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if total != 1 || len(items) != 1 || summary.PaidCount != 1 || summary.AmountCents != 3000 {
|
|
t.Fatalf("unexpected list result: total=%d items=%d summary=%+v", total, len(items), summary)
|
|
}
|
|
item := items[0]
|
|
if item.Provider != "wechat-v3" || item.ProviderTradeNo != "WX-1" || item.PaymentStatus != "paid" || item.FulfillmentStatus != "succeeded" || item.RefundStatus != "none" {
|
|
t.Fatalf("payment state was not joined: %+v", item)
|
|
}
|
|
}
|