117 lines
3.2 KiB
Go
117 lines
3.2 KiB
Go
//go:build unit
|
|
|
|
package service
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
"testing"
|
|
|
|
"github.com/Wei-Shaw/sub2api/internal/payment"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestBuildPaymentOrderProviderSnapshot_ExcludesSensitiveConfig(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
sel := &payment.InstanceSelection{
|
|
InstanceID: "12",
|
|
ProviderKey: payment.TypeWxpay,
|
|
SupportedTypes: "wxpay,wxpay_direct",
|
|
PaymentMode: "popup",
|
|
Config: map[string]string{
|
|
"privateKey": "secret",
|
|
"apiV3Key": "secret-v3",
|
|
"appId": "wx-app-id",
|
|
},
|
|
}
|
|
|
|
snapshot := buildPaymentOrderProviderSnapshot(sel)
|
|
require.Equal(t, map[string]any{
|
|
"schema_version": 1,
|
|
"provider_instance_id": "12",
|
|
"provider_key": payment.TypeWxpay,
|
|
"payment_mode": "popup",
|
|
}, snapshot)
|
|
require.NotContains(t, snapshot, "config")
|
|
require.NotContains(t, snapshot, "privateKey")
|
|
require.NotContains(t, snapshot, "apiV3Key")
|
|
require.NotContains(t, snapshot, "supported_types")
|
|
require.NotContains(t, snapshot, "instance_name")
|
|
}
|
|
|
|
func TestCreateOrderInTx_WritesProviderSnapshot(t *testing.T) {
|
|
ctx := context.Background()
|
|
client := newPaymentConfigServiceTestClient(t)
|
|
|
|
user, err := client.User.Create().
|
|
SetEmail("snapshot@example.com").
|
|
SetPasswordHash("hash").
|
|
SetUsername("snapshot-user").
|
|
Save(ctx)
|
|
require.NoError(t, err)
|
|
|
|
instance, err := client.PaymentProviderInstance.Create().
|
|
SetProviderKey(payment.TypeAlipay).
|
|
SetName("Primary Alipay").
|
|
SetConfig(`{"secretKey":"do-not-copy"}`).
|
|
SetSupportedTypes("alipay,alipay_direct").
|
|
SetPaymentMode("redirect").
|
|
SetEnabled(true).
|
|
Save(ctx)
|
|
require.NoError(t, err)
|
|
|
|
svc := &PaymentService{entClient: client}
|
|
order, err := svc.createOrderInTx(
|
|
ctx,
|
|
CreateOrderRequest{
|
|
UserID: user.ID,
|
|
PaymentType: payment.TypeAlipay,
|
|
OrderType: payment.OrderTypeBalance,
|
|
ClientIP: "127.0.0.1",
|
|
SrcHost: "app.example.com",
|
|
},
|
|
&User{
|
|
ID: user.ID,
|
|
Email: user.Email,
|
|
Username: user.Username,
|
|
},
|
|
nil,
|
|
&PaymentConfig{
|
|
MaxPendingOrders: 3,
|
|
OrderTimeoutMin: 30,
|
|
},
|
|
88,
|
|
88,
|
|
0,
|
|
88,
|
|
&payment.InstanceSelection{
|
|
InstanceID: strconv.FormatInt(instance.ID, 10),
|
|
ProviderKey: payment.TypeAlipay,
|
|
SupportedTypes: "alipay,alipay_direct",
|
|
PaymentMode: "redirect",
|
|
Config: map[string]string{
|
|
"secretKey": "do-not-copy",
|
|
},
|
|
},
|
|
)
|
|
require.NoError(t, err)
|
|
require.Equal(t, strconv.FormatInt(instance.ID, 10), valueOrEmpty(order.ProviderInstanceID))
|
|
require.Equal(t, payment.TypeAlipay, valueOrEmpty(order.ProviderKey))
|
|
require.Equal(t, float64(1), order.ProviderSnapshot["schema_version"])
|
|
require.Equal(t, strconv.FormatInt(instance.ID, 10), order.ProviderSnapshot["provider_instance_id"])
|
|
require.Equal(t, payment.TypeAlipay, order.ProviderSnapshot["provider_key"])
|
|
require.Equal(t, "redirect", order.ProviderSnapshot["payment_mode"])
|
|
require.NotContains(t, order.ProviderSnapshot, "config")
|
|
require.NotContains(t, order.ProviderSnapshot, "secretKey")
|
|
require.NotContains(t, order.ProviderSnapshot, "supported_types")
|
|
require.NotContains(t, order.ProviderSnapshot, "instance_name")
|
|
}
|
|
|
|
func valueOrEmpty(v *string) string {
|
|
if v == nil {
|
|
return ""
|
|
}
|
|
return *v
|
|
}
|