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