kra-new/internal/integration/payment/wechat_v3_douyin_refund_tes...

121 lines
4.2 KiB
Go

package payment
import (
"context"
"strings"
"testing"
"kra/internal/biz"
gopayDouyin "github.com/go-pay/gopay/douyin"
gopayWechatV3 "github.com/go-pay/gopay/wechat/v3"
)
func TestWechatV3RefundRejectsBlankIdentityBeforeClient(t *testing.T) {
for _, tc := range []struct {
name string
req *biz.PaymentRefundRequest
want string
}{
{name: "blank trade number", req: &biz.PaymentRefundRequest{TradeNo: " ", RefundNo: "R1"}, want: "out_trade_no"},
{name: "blank refund number", req: &biz.PaymentRefundRequest{TradeNo: "T1", RefundNo: " "}, want: "out_refund_no"},
{name: "invalid amount", req: &biz.PaymentRefundRequest{TradeNo: "T1", RefundNo: "R1", Amount: 2, TotalAmount: 1}, want: "金额"},
} {
t.Run(tc.name, func(t *testing.T) {
_, err := (&wechatV3Adapter{}).Refund(context.Background(), tc.req, nil)
if err == nil || !strings.Contains(err.Error(), tc.want) {
t.Fatalf("Refund() error = %v, want %q", err, tc.want)
}
})
}
}
func TestWechatV3RefundIdentityValidation(t *testing.T) {
valid := func() *gopayWechatV3.RefundOrderResponse {
return &gopayWechatV3.RefundOrderResponse{
OutTradeNo: " T1 ",
OutRefundNo: " R1 ",
RefundId: " WX-R1 ",
}
}
refundID, err := validateWechatV3RefundIdentity(valid(), " T1 ", " R1 ")
if err != nil {
t.Fatalf("valid refund response: %v", err)
}
if refundID != "WX-R1" {
t.Fatalf("refund id = %q, want %q", refundID, "WX-R1")
}
for _, tc := range []struct {
name string
edit func(*gopayWechatV3.RefundOrderResponse)
}{
{name: "trade number missing", edit: func(r *gopayWechatV3.RefundOrderResponse) { r.OutTradeNo = " " }},
{name: "trade number mismatch", edit: func(r *gopayWechatV3.RefundOrderResponse) { r.OutTradeNo = "OTHER" }},
{name: "refund number missing", edit: func(r *gopayWechatV3.RefundOrderResponse) { r.OutRefundNo = " " }},
{name: "refund number mismatch", edit: func(r *gopayWechatV3.RefundOrderResponse) { r.OutRefundNo = "OTHER" }},
{name: "provider refund id missing", edit: func(r *gopayWechatV3.RefundOrderResponse) { r.RefundId = " " }},
} {
t.Run(tc.name, func(t *testing.T) {
refund := valid()
tc.edit(refund)
if _, err := validateWechatV3RefundIdentity(refund, "T1", "R1"); err == nil {
t.Fatal("accepted invalid refund identity")
}
})
}
}
func TestDouyinRefundRejectsBlankIdentityBeforeClient(t *testing.T) {
for _, tc := range []struct {
name string
req *biz.PaymentRefundRequest
want string
}{
{name: "blank trade number", req: &biz.PaymentRefundRequest{TradeNo: " ", RefundNo: "R1"}, want: "out_trade_no"},
{name: "blank refund number", req: &biz.PaymentRefundRequest{TradeNo: "T1", RefundNo: " "}, want: "out_refund_no"},
{name: "invalid amount", req: &biz.PaymentRefundRequest{TradeNo: "T1", RefundNo: "R1", Amount: 2, TotalAmount: 1}, want: "金额"},
} {
t.Run(tc.name, func(t *testing.T) {
_, err := (&douyinAdapter{}).Refund(context.Background(), tc.req, nil)
if err == nil || !strings.Contains(err.Error(), tc.want) {
t.Fatalf("Refund() error = %v, want %q", err, tc.want)
}
})
}
}
func TestDouyinRefundIdentityValidation(t *testing.T) {
valid := func() *gopayDouyin.Refund {
return &gopayDouyin.Refund{
OutTradeNo: " T1 ",
OutRefundNo: " R1 ",
RefundId: " DY-R1 ",
}
}
refundID, err := validateDouyinRefundIdentity(valid(), " T1 ", " R1 ")
if err != nil {
t.Fatalf("valid refund response: %v", err)
}
if refundID != "DY-R1" {
t.Fatalf("refund id = %q, want %q", refundID, "DY-R1")
}
for _, tc := range []struct {
name string
edit func(*gopayDouyin.Refund)
}{
{name: "trade number missing", edit: func(r *gopayDouyin.Refund) { r.OutTradeNo = " " }},
{name: "trade number mismatch", edit: func(r *gopayDouyin.Refund) { r.OutTradeNo = "OTHER" }},
{name: "refund number missing", edit: func(r *gopayDouyin.Refund) { r.OutRefundNo = " " }},
{name: "refund number mismatch", edit: func(r *gopayDouyin.Refund) { r.OutRefundNo = "OTHER" }},
{name: "provider refund id missing", edit: func(r *gopayDouyin.Refund) { r.RefundId = " " }},
} {
t.Run(tc.name, func(t *testing.T) {
refund := valid()
tc.edit(refund)
if _, err := validateDouyinRefundIdentity(refund, "T1", "R1"); err == nil {
t.Fatal("accepted invalid refund identity")
}
})
}
}