//go:build unit package service import ( "context" "testing" "time" "github.com/Wei-Shaw/sub2api/internal/payment" infraerrors "github.com/Wei-Shaw/sub2api/internal/pkg/errors" "github.com/stretchr/testify/require" ) func TestValidateRefundRequestRejectsLegacyGuessedProviderInstance(t *testing.T) { ctx := context.Background() client := newPaymentConfigServiceTestClient(t) user, err := client.User.Create(). SetEmail("refund-legacy@example.com"). SetPasswordHash("hash"). SetUsername("refund-legacy-user"). Save(ctx) require.NoError(t, err) _, err = client.PaymentProviderInstance.Create(). SetProviderKey(payment.TypeAlipay). SetName("alipay-refund-instance"). SetConfig("{}"). SetSupportedTypes("alipay"). SetEnabled(true). SetAllowUserRefund(true). SetRefundEnabled(true). Save(ctx) require.NoError(t, err) order, err := client.PaymentOrder.Create(). SetUserID(user.ID). SetUserEmail(user.Email). SetUserName(user.Username). SetAmount(88). SetPayAmount(88). SetFeeRate(0). SetRechargeCode("REFUND-LEGACY-ORDER"). SetOutTradeNo("sub2_refund_legacy_order"). SetPaymentType(payment.TypeAlipay). SetPaymentTradeNo("trade-legacy-refund"). SetOrderType(payment.OrderTypeBalance). SetStatus(OrderStatusCompleted). SetExpiresAt(time.Now().Add(time.Hour)). SetPaidAt(time.Now()). SetClientIP("127.0.0.1"). SetSrcHost("api.example.com"). Save(ctx) require.NoError(t, err) svc := &PaymentService{ entClient: client, } _, err = svc.validateRefundRequest(ctx, order.ID, user.ID) require.Error(t, err) require.Equal(t, "USER_REFUND_DISABLED", infraerrors.Reason(err)) } func TestPrepareRefundRejectsLegacyGuessedProviderInstance(t *testing.T) { ctx := context.Background() client := newPaymentConfigServiceTestClient(t) user, err := client.User.Create(). SetEmail("refund-legacy-admin@example.com"). SetPasswordHash("hash"). SetUsername("refund-legacy-admin-user"). Save(ctx) require.NoError(t, err) _, err = client.PaymentProviderInstance.Create(). SetProviderKey(payment.TypeAlipay). SetName("alipay-refund-admin-instance"). SetConfig("{}"). SetSupportedTypes("alipay"). SetEnabled(true). SetAllowUserRefund(true). SetRefundEnabled(true). Save(ctx) require.NoError(t, err) order, err := client.PaymentOrder.Create(). SetUserID(user.ID). SetUserEmail(user.Email). SetUserName(user.Username). SetAmount(188). SetPayAmount(188). SetFeeRate(0). SetRechargeCode("REFUND-LEGACY-ADMIN-ORDER"). SetOutTradeNo("sub2_refund_legacy_admin_order"). SetPaymentType(payment.TypeAlipay). SetPaymentTradeNo("trade-legacy-admin-refund"). SetOrderType(payment.OrderTypeBalance). SetStatus(OrderStatusCompleted). SetExpiresAt(time.Now().Add(time.Hour)). SetPaidAt(time.Now()). SetClientIP("127.0.0.1"). SetSrcHost("api.example.com"). Save(ctx) require.NoError(t, err) svc := &PaymentService{ entClient: client, } plan, result, err := svc.PrepareRefund(ctx, order.ID, 0, "", false, false) require.Nil(t, plan) require.Nil(t, result) require.Error(t, err) require.Equal(t, "REFUND_DISABLED", infraerrors.Reason(err)) }