package gateway_test import ( "testing" "github.com/wangjia/pay/internal/gateway" "github.com/wangjia/pay/internal/model" ) func TestDBProductResolver(t *testing.T) { db := model.OpenTestDB(t) db.Create(&model.Product{Name: "标准年付", Price: "299.00", BizCode: "annual_standard", Active: true}) r := gateway.NewDBProductResolver(db) minor, subject, bizCode, err := r.Resolve("annual_standard", "CNY") if err != nil || minor != 29900 || subject != "标准年付" || bizCode != "annual_standard" { t.Fatalf("resolve = %d %s %s %v", minor, subject, bizCode, err) } if _, _, _, err := r.Resolve("ghost", "CNY"); err != gateway.ErrProductNotFound { t.Fatalf("缺套餐应 ErrProductNotFound, got %v", err) } } func TestDBProductResolverMultiCurrency(t *testing.T) { db := model.OpenTestDB(t) // 一个套餐:CNY 走 v1 Price 元 string 回退;USD/USDT 走 ProductPrice。 p := model.Product{Name: "Pro 年付", Price: "199.00", BizCode: "pro_year", Active: true, MerchantID: 1} if err := db.Create(&p).Error; err != nil { t.Fatal(err) } rows := []model.ProductPrice{ {ProductID: p.ID, Currency: "USD", AmountMinor: 2999}, {ProductID: p.ID, Currency: "USDT", AmountMinor: 29990000}, } if err := db.Create(&rows).Error; err != nil { t.Fatal(err) } r := gateway.NewDBProductResolver(db) // CNY 回退 Product.Price("199.00" 元 → 19900 分) if amt, _, code, err := r.Resolve("pro_year", "CNY"); err != nil || amt != 19900 || code != "pro_year" { t.Fatalf("CNY resolve = %d,%q,%v want 19900,pro_year,nil", amt, code, err) } // USD 走 ProductPrice if amt, _, _, err := r.Resolve("pro_year", "USD"); err != nil || amt != 2999 { t.Fatalf("USD resolve = %d,%v want 2999", amt, err) } // USDT 走 ProductPrice if amt, _, _, err := r.Resolve("pro_year", "USDT"); err != nil || amt != 29990000 { t.Fatalf("USDT resolve = %d,%v want 29990000", amt, err) } // 不支持的币种 → ErrProductNotFound if _, _, _, err := r.Resolve("pro_year", "JPY"); err != gateway.ErrProductNotFound { t.Fatalf("JPY resolve err = %v want ErrProductNotFound", err) } }