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