Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

107 řádky
2.6 KiB

  1. package controller
  2. import (
  3. "bytes"
  4. "net/http"
  5. "net/http/httptest"
  6. "testing"
  7. "github.com/QuantumNous/new-api/common"
  8. "github.com/QuantumNous/new-api/i18n"
  9. "github.com/QuantumNous/new-api/model"
  10. "github.com/gin-gonic/gin"
  11. "github.com/glebarez/sqlite"
  12. "github.com/stretchr/testify/assert"
  13. "github.com/stretchr/testify/require"
  14. "gorm.io/gorm"
  15. )
  16. func setupUserTopUpTestDB(t *testing.T) *gorm.DB {
  17. t.Helper()
  18. db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
  19. require.NoError(t, err)
  20. sqlDB, err := db.DB()
  21. require.NoError(t, err)
  22. sqlDB.SetMaxOpenConns(1)
  23. origDB := model.DB
  24. origLogDB := model.LOG_DB
  25. origUsingSQLite := common.UsingSQLite
  26. origRedisEnabled := common.RedisEnabled
  27. model.DB = db
  28. model.LOG_DB = db
  29. common.UsingSQLite = true
  30. common.RedisEnabled = false
  31. require.NoError(t, db.AutoMigrate(&model.User{}, &model.Redemption{}, &model.Log{}))
  32. t.Cleanup(func() {
  33. model.DB = origDB
  34. model.LOG_DB = origLogDB
  35. common.UsingSQLite = origUsingSQLite
  36. common.RedisEnabled = origRedisEnabled
  37. require.NoError(t, sqlDB.Close())
  38. })
  39. return db
  40. }
  41. func setupUserTopUpRouter(userID int) *gin.Engine {
  42. gin.SetMode(gin.TestMode)
  43. r := gin.New()
  44. r.POST("/api/user/topup", func(c *gin.Context) {
  45. c.Set("id", userID)
  46. c.Next()
  47. }, TopUp)
  48. return r
  49. }
  50. func TestTopUp_SyncedUserDenied(t *testing.T) {
  51. db := setupUserTopUpTestDB(t)
  52. i18n.Init()
  53. user := &model.User{
  54. Id: 100,
  55. Username: "synced-topup-test",
  56. Password: "hashed_password",
  57. Quota: 100000,
  58. Source: common.UserSourceSynced,
  59. }
  60. require.NoError(t, db.Create(user).Error)
  61. redemption := &model.Redemption{
  62. Id: 1,
  63. UserId: 1,
  64. Key: "synced-topup-key",
  65. Status: common.RedemptionCodeStatusEnabled,
  66. Quota: 50000,
  67. CreatedTime: common.GetTimestamp(),
  68. }
  69. require.NoError(t, db.Create(redemption).Error)
  70. router := setupUserTopUpRouter(100)
  71. w := httptest.NewRecorder()
  72. reqBody, err := common.Marshal(map[string]string{"key": "synced-topup-key"})
  73. require.NoError(t, err)
  74. req, err := http.NewRequest(http.MethodPost, "/api/user/topup", bytes.NewReader(reqBody))
  75. require.NoError(t, err)
  76. req.Header.Set("Content-Type", "application/json")
  77. req.Header.Set("Accept-Language", "zh-CN")
  78. router.ServeHTTP(w, req)
  79. assert.Equal(t, http.StatusOK, w.Code)
  80. var resp map[string]interface{}
  81. require.NoError(t, common.Unmarshal(w.Body.Bytes(), &resp))
  82. assert.False(t, resp["success"].(bool))
  83. assert.Equal(t, "同步用户不允许使用兑换码", resp["message"])
  84. var updatedUser model.User
  85. require.NoError(t, db.First(&updatedUser, 100).Error)
  86. assert.Equal(t, 100000, updatedUser.Quota)
  87. }