package controller import ( "bytes" "net/http" "net/http/httptest" "testing" "github.com/QuantumNous/new-api/common" "github.com/QuantumNous/new-api/i18n" "github.com/QuantumNous/new-api/model" "github.com/gin-gonic/gin" "github.com/glebarez/sqlite" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gorm.io/gorm" ) func setupUserTopUpTestDB(t *testing.T) *gorm.DB { t.Helper() db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) require.NoError(t, err) sqlDB, err := db.DB() require.NoError(t, err) sqlDB.SetMaxOpenConns(1) origDB := model.DB origLogDB := model.LOG_DB origUsingSQLite := common.UsingSQLite origRedisEnabled := common.RedisEnabled model.DB = db model.LOG_DB = db common.UsingSQLite = true common.RedisEnabled = false require.NoError(t, db.AutoMigrate(&model.User{}, &model.Redemption{}, &model.Log{})) t.Cleanup(func() { model.DB = origDB model.LOG_DB = origLogDB common.UsingSQLite = origUsingSQLite common.RedisEnabled = origRedisEnabled require.NoError(t, sqlDB.Close()) }) return db } func setupUserTopUpRouter(userID int) *gin.Engine { gin.SetMode(gin.TestMode) r := gin.New() r.POST("/api/user/topup", func(c *gin.Context) { c.Set("id", userID) c.Next() }, TopUp) return r } func TestTopUp_SyncedUserDenied(t *testing.T) { db := setupUserTopUpTestDB(t) i18n.Init() user := &model.User{ Id: 100, Username: "synced-topup-test", Password: "hashed_password", Quota: 100000, Source: common.UserSourceSynced, } require.NoError(t, db.Create(user).Error) redemption := &model.Redemption{ Id: 1, UserId: 1, Key: "synced-topup-key", Status: common.RedemptionCodeStatusEnabled, Quota: 50000, CreatedTime: common.GetTimestamp(), } require.NoError(t, db.Create(redemption).Error) router := setupUserTopUpRouter(100) w := httptest.NewRecorder() reqBody, err := common.Marshal(map[string]string{"key": "synced-topup-key"}) require.NoError(t, err) req, err := http.NewRequest(http.MethodPost, "/api/user/topup", bytes.NewReader(reqBody)) require.NoError(t, err) req.Header.Set("Content-Type", "application/json") req.Header.Set("Accept-Language", "zh-CN") router.ServeHTTP(w, req) assert.Equal(t, http.StatusOK, w.Code) var resp map[string]interface{} require.NoError(t, common.Unmarshal(w.Body.Bytes(), &resp)) assert.False(t, resp["success"].(bool)) assert.Equal(t, "同步用户不允许使用兑换码", resp["message"]) var updatedUser model.User require.NoError(t, db.First(&updatedUser, 100).Error) assert.Equal(t, 100000, updatedUser.Quota) }