102 lines
3.2 KiB
Go
102 lines
3.2 KiB
Go
package fake_test
|
|
|
|
import (
|
|
"context"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/wangjia/pay/internal/provider"
|
|
"github.com/wangjia/pay/internal/provider/fake"
|
|
)
|
|
|
|
func TestFakeCreateAndVerify(t *testing.T) {
|
|
var _ provider.Provider = fake.New() // 编译期断言满足接口
|
|
|
|
p := fake.New()
|
|
ctx := context.Background()
|
|
|
|
sess, err := p.Create(ctx, provider.CreateRequest{OutTradeNo: "PAY-1", AmountMinor: 29990000, Currency: "USDT"})
|
|
if err != nil {
|
|
t.Fatalf("create: %v", err)
|
|
}
|
|
if !strings.HasPrefix(sess.ProviderRef, "FAKE-PAY-1") || sess.RenderType != provider.RenderCryptoAddress {
|
|
t.Fatalf("session = %+v", sess)
|
|
}
|
|
|
|
ev, err := p.VerifyCallback(ctx, provider.CallbackInput{
|
|
Raw: []byte(`{"provider_ref":"FAKE-PAY-1","status":"succeeded","amount_minor":29990000,"currency":"USDT"}`),
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("verify: %v", err)
|
|
}
|
|
if ev.ProviderRef != "FAKE-PAY-1" || ev.Status != provider.PaidSucceeded || ev.PaidAmountMinor != 29990000 {
|
|
t.Fatalf("event = %+v", ev)
|
|
}
|
|
}
|
|
|
|
// TestFakeCreateRedirect 覆盖 Create 按 metadata["render"]="redirect" 出的 redirect
|
|
// 三态分支(pangolin /buy 联调门控,见 fake.go Create 注释)。
|
|
func TestFakeCreateRedirect(t *testing.T) {
|
|
p := fake.New()
|
|
ctx := context.Background()
|
|
|
|
sess, err := p.Create(ctx, provider.CreateRequest{
|
|
OutTradeNo: "PAY-REDIRECT-1", AmountMinor: 100, Currency: "USDT",
|
|
Metadata: map[string]string{"render": "redirect"},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("create: %v", err)
|
|
}
|
|
if sess.RenderType != provider.RenderRedirect {
|
|
t.Fatalf("render_type = %v, want redirect", sess.RenderType)
|
|
}
|
|
url, _ := sess.Payload["url"].(string)
|
|
if !strings.Contains(url, "mock-cashier") || !strings.Contains(url, "PAY-REDIRECT-1") {
|
|
t.Fatalf("payload.url = %q, want 含 mock-cashier 与 out_trade_no", url)
|
|
}
|
|
}
|
|
|
|
// TestFakeCreateQR 覆盖 metadata["render"]="qr" 分支。
|
|
func TestFakeCreateQR(t *testing.T) {
|
|
p := fake.New()
|
|
ctx := context.Background()
|
|
|
|
sess, err := p.Create(ctx, provider.CreateRequest{
|
|
OutTradeNo: "PAY-QR-1", AmountMinor: 12345, Currency: "CNY",
|
|
Metadata: map[string]string{"render": "qr"},
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("create: %v", err)
|
|
}
|
|
if sess.RenderType != provider.RenderQR {
|
|
t.Fatalf("render_type = %v, want qr", sess.RenderType)
|
|
}
|
|
if _, ok := sess.Payload["qr_content"]; !ok {
|
|
t.Fatalf("payload 缺 qr_content: %+v", sess.Payload)
|
|
}
|
|
if got := sess.Payload["display_amount"]; got != "12345" {
|
|
t.Fatalf("payload.display_amount = %v, want 12345", got)
|
|
}
|
|
if got := sess.Payload["currency"]; got != "CNY" {
|
|
t.Fatalf("payload.currency = %v, want CNY", got)
|
|
}
|
|
}
|
|
|
|
func TestFakeQueryPreset(t *testing.T) {
|
|
p := fake.New()
|
|
ctx := context.Background()
|
|
|
|
ev, _ := p.Query(ctx, provider.QueryRequest{ProviderRef: "FAKE-PAY-2"})
|
|
if ev.Status != provider.PaidPending {
|
|
t.Fatalf("默认应 pending, got %v", ev.Status)
|
|
}
|
|
|
|
p.SetQueryResult("FAKE-PAY-2", provider.PaidEvent{
|
|
ProviderRef: "FAKE-PAY-2", Status: provider.PaidSucceeded, PaidAmountMinor: 100, PaidCurrency: "USDT",
|
|
})
|
|
ev2, _ := p.Query(ctx, provider.QueryRequest{ProviderRef: "FAKE-PAY-2"})
|
|
if ev2.Status != provider.PaidSucceeded || ev2.PaidAmountMinor != 100 {
|
|
t.Fatalf("预置后应 succeeded, got %+v", ev2)
|
|
}
|
|
}
|