fix: guard payment fulfillment provider mismatch
This commit is contained in:
@@ -3,12 +3,37 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"github.com/Wei-Shaw/sub2api/internal/payment"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
type paymentFulfillmentTestProvider struct {
|
||||
key string
|
||||
supportedTypes []payment.PaymentType
|
||||
}
|
||||
|
||||
func (p paymentFulfillmentTestProvider) Name() string { return p.key }
|
||||
func (p paymentFulfillmentTestProvider) ProviderKey() string { return p.key }
|
||||
func (p paymentFulfillmentTestProvider) SupportedTypes() []payment.PaymentType {
|
||||
return p.supportedTypes
|
||||
}
|
||||
func (p paymentFulfillmentTestProvider) CreatePayment(ctx context.Context, req payment.CreatePaymentRequest) (*payment.CreatePaymentResponse, error) {
|
||||
panic("unexpected call")
|
||||
}
|
||||
func (p paymentFulfillmentTestProvider) QueryOrder(ctx context.Context, tradeNo string) (*payment.QueryOrderResponse, error) {
|
||||
panic("unexpected call")
|
||||
}
|
||||
func (p paymentFulfillmentTestProvider) VerifyNotification(ctx context.Context, rawBody string, headers map[string]string) (*payment.PaymentNotification, error) {
|
||||
panic("unexpected call")
|
||||
}
|
||||
func (p paymentFulfillmentTestProvider) Refund(ctx context.Context, req payment.RefundRequest) (*payment.RefundResponse, error) {
|
||||
panic("unexpected call")
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// resolveRedeemAction — pure idempotency decision logic
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -161,3 +186,42 @@ func TestResolveRedeemAction_IsUsedCanUseConsistency(t *testing.T) {
|
||||
assert.True(t, unusedCode.CanUse())
|
||||
assert.Equal(t, redeemActionRedeem, resolveRedeemAction(unusedCode, nil))
|
||||
}
|
||||
|
||||
func TestExpectedNotificationProviderKeyPrefersOrderInstanceProvider(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
registry := payment.NewRegistry()
|
||||
registry.Register(paymentFulfillmentTestProvider{
|
||||
key: payment.TypeAlipay,
|
||||
supportedTypes: []payment.PaymentType{payment.TypeAlipay},
|
||||
})
|
||||
|
||||
assert.Equal(t,
|
||||
payment.TypeEasyPay,
|
||||
expectedNotificationProviderKey(registry, payment.TypeAlipay, payment.TypeEasyPay),
|
||||
)
|
||||
}
|
||||
|
||||
func TestExpectedNotificationProviderKeyUsesRegistryMappingForLegacyOrders(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
registry := payment.NewRegistry()
|
||||
registry.Register(paymentFulfillmentTestProvider{
|
||||
key: payment.TypeEasyPay,
|
||||
supportedTypes: []payment.PaymentType{payment.TypeAlipay},
|
||||
})
|
||||
|
||||
assert.Equal(t,
|
||||
payment.TypeEasyPay,
|
||||
expectedNotificationProviderKey(registry, payment.TypeAlipay, ""),
|
||||
)
|
||||
}
|
||||
|
||||
func TestExpectedNotificationProviderKeyFallsBackToPaymentType(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
assert.Equal(t,
|
||||
payment.TypeWxpay,
|
||||
expectedNotificationProviderKey(nil, payment.TypeWxpay, ""),
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user