payment_method_guard_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package model
  2. import (
  3. "testing"
  4. "time"
  5. "github.com/QuantumNous/new-api/common"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func insertUserForPaymentGuardTest(t *testing.T, id int, quota int) {
  10. t.Helper()
  11. user := &User{
  12. Id: id,
  13. Username: "payment_guard_user",
  14. Status: common.UserStatusEnabled,
  15. Quota: quota,
  16. }
  17. require.NoError(t, DB.Create(user).Error)
  18. }
  19. func insertSubscriptionPlanForPaymentGuardTest(t *testing.T, id int) *SubscriptionPlan {
  20. t.Helper()
  21. plan := &SubscriptionPlan{
  22. Id: id,
  23. Title: "Guard Plan",
  24. PriceAmount: 9.99,
  25. Currency: "USD",
  26. DurationUnit: SubscriptionDurationMonth,
  27. DurationValue: 1,
  28. Enabled: true,
  29. TotalAmount: 1000,
  30. }
  31. require.NoError(t, DB.Create(plan).Error)
  32. return plan
  33. }
  34. func insertSubscriptionOrderForPaymentGuardTest(t *testing.T, tradeNo string, userID int, planID int, paymentProvider string) {
  35. t.Helper()
  36. order := &SubscriptionOrder{
  37. UserId: userID,
  38. PlanId: planID,
  39. Money: 9.99,
  40. TradeNo: tradeNo,
  41. PaymentMethod: paymentProvider,
  42. PaymentProvider: paymentProvider,
  43. Status: common.TopUpStatusPending,
  44. CreateTime: time.Now().Unix(),
  45. }
  46. require.NoError(t, order.Insert())
  47. }
  48. func insertTopUpForPaymentGuardTest(t *testing.T, tradeNo string, userID int, paymentProvider string) {
  49. t.Helper()
  50. topUp := &TopUp{
  51. UserId: userID,
  52. Amount: 2,
  53. Money: 9.99,
  54. TradeNo: tradeNo,
  55. PaymentMethod: paymentProvider,
  56. PaymentProvider: paymentProvider,
  57. Status: common.TopUpStatusPending,
  58. CreateTime: time.Now().Unix(),
  59. }
  60. require.NoError(t, topUp.Insert())
  61. }
  62. func getTopUpStatusForPaymentGuardTest(t *testing.T, tradeNo string) string {
  63. t.Helper()
  64. topUp := GetTopUpByTradeNo(tradeNo)
  65. require.NotNil(t, topUp)
  66. return topUp.Status
  67. }
  68. func countUserSubscriptionsForPaymentGuardTest(t *testing.T, userID int) int64 {
  69. t.Helper()
  70. var count int64
  71. require.NoError(t, DB.Model(&UserSubscription{}).Where("user_id = ?", userID).Count(&count).Error)
  72. return count
  73. }
  74. func getUserQuotaForPaymentGuardTest(t *testing.T, userID int) int {
  75. t.Helper()
  76. var user User
  77. require.NoError(t, DB.Select("quota").Where("id = ?", userID).First(&user).Error)
  78. return user.Quota
  79. }
  80. func TestRechargeWaffoPancake_RejectsMismatchedPaymentMethod(t *testing.T) {
  81. truncateTables(t)
  82. insertUserForPaymentGuardTest(t, 101, 0)
  83. insertTopUpForPaymentGuardTest(t, "waffo-pancake-guard", 101, PaymentProviderStripe)
  84. err := RechargeWaffoPancake("waffo-pancake-guard")
  85. require.Error(t, err)
  86. topUp := GetTopUpByTradeNo("waffo-pancake-guard")
  87. require.NotNil(t, topUp)
  88. assert.Equal(t, common.TopUpStatusPending, topUp.Status)
  89. assert.Equal(t, 0, getUserQuotaForPaymentGuardTest(t, 101))
  90. }
  91. func TestUpdatePendingTopUpStatus_RejectsMismatchedPaymentProvider(t *testing.T) {
  92. testCases := []struct {
  93. name string
  94. tradeNo string
  95. storedPaymentProvider string
  96. expectedPaymentProvider string
  97. targetStatus string
  98. }{
  99. {
  100. name: "stripe expire",
  101. tradeNo: "stripe-expire-guard",
  102. storedPaymentProvider: PaymentProviderCreem,
  103. expectedPaymentProvider: PaymentProviderStripe,
  104. targetStatus: common.TopUpStatusExpired,
  105. },
  106. {
  107. name: "waffo failed",
  108. tradeNo: "waffo-failed-guard",
  109. storedPaymentProvider: PaymentProviderStripe,
  110. expectedPaymentProvider: PaymentProviderWaffo,
  111. targetStatus: common.TopUpStatusFailed,
  112. },
  113. }
  114. for _, tc := range testCases {
  115. t.Run(tc.name, func(t *testing.T) {
  116. truncateTables(t)
  117. insertUserForPaymentGuardTest(t, 150, 0)
  118. insertTopUpForPaymentGuardTest(t, tc.tradeNo, 150, tc.storedPaymentProvider)
  119. err := UpdatePendingTopUpStatus(tc.tradeNo, tc.expectedPaymentProvider, tc.targetStatus)
  120. require.ErrorIs(t, err, ErrPaymentMethodMismatch)
  121. assert.Equal(t, common.TopUpStatusPending, getTopUpStatusForPaymentGuardTest(t, tc.tradeNo))
  122. })
  123. }
  124. }
  125. func TestCompleteSubscriptionOrder_RejectsMismatchedPaymentProvider(t *testing.T) {
  126. truncateTables(t)
  127. insertUserForPaymentGuardTest(t, 202, 0)
  128. plan := insertSubscriptionPlanForPaymentGuardTest(t, 301)
  129. insertSubscriptionOrderForPaymentGuardTest(t, "sub-guard-order", 202, plan.Id, PaymentProviderStripe)
  130. err := CompleteSubscriptionOrder("sub-guard-order", `{"provider":"epay"}`, PaymentProviderEpay, "alipay")
  131. require.ErrorIs(t, err, ErrPaymentMethodMismatch)
  132. order := GetSubscriptionOrderByTradeNo("sub-guard-order")
  133. require.NotNil(t, order)
  134. assert.Equal(t, common.TopUpStatusPending, order.Status)
  135. assert.Zero(t, countUserSubscriptionsForPaymentGuardTest(t, 202))
  136. topUp := GetTopUpByTradeNo("sub-guard-order")
  137. assert.Nil(t, topUp)
  138. }
  139. func TestExpireSubscriptionOrder_RejectsMismatchedPaymentProvider(t *testing.T) {
  140. truncateTables(t)
  141. insertUserForPaymentGuardTest(t, 303, 0)
  142. plan := insertSubscriptionPlanForPaymentGuardTest(t, 401)
  143. insertSubscriptionOrderForPaymentGuardTest(t, "sub-expire-guard", 303, plan.Id, PaymentProviderStripe)
  144. err := ExpireSubscriptionOrder("sub-expire-guard", PaymentProviderCreem)
  145. require.ErrorIs(t, err, ErrPaymentMethodMismatch)
  146. order := GetSubscriptionOrderByTradeNo("sub-expire-guard")
  147. require.NotNil(t, order)
  148. assert.Equal(t, common.TopUpStatusPending, order.Status)
  149. }