Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

147 строки
3.8 KiB

  1. package controller
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "net/http"
  6. "net/http/httptest"
  7. "testing"
  8. "github.com/QuantumNous/new-api/common"
  9. "github.com/QuantumNous/new-api/model"
  10. "github.com/gin-gonic/gin"
  11. "github.com/glebarez/sqlite"
  12. "github.com/stretchr/testify/require"
  13. "gorm.io/gorm"
  14. )
  15. func setupUserControllerDB(t *testing.T) *gorm.DB {
  16. t.Helper()
  17. db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
  18. require.NoError(t, err)
  19. sqlDB, err := db.DB()
  20. require.NoError(t, err)
  21. sqlDB.SetMaxOpenConns(1)
  22. require.NoError(t, db.AutoMigrate(&model.User{}))
  23. return db
  24. }
  25. func TestUpdateUser_SyncedUserAllowsNonQuotaEditsWithoutOverwritingQuota(t *testing.T) {
  26. gin.SetMode(gin.TestMode)
  27. router := gin.New()
  28. router.Use(testRootAuthMiddleware())
  29. router.PUT("/api/user/", UpdateUser)
  30. db := setupUserControllerDB(t)
  31. orig := model.DB
  32. origRedisEnabled := common.RedisEnabled
  33. model.DB = db
  34. defer func() {
  35. model.DB = orig
  36. common.RedisEnabled = origRedisEnabled
  37. }()
  38. common.RedisEnabled = false
  39. require.NoError(t, db.Create(&model.User{
  40. Id: 1001,
  41. Username: "synced-user",
  42. Password: "hashed-password",
  43. DisplayName: "Old Name",
  44. Role: common.RoleCommonUser,
  45. Status: common.UserStatusEnabled,
  46. Group: "default",
  47. Quota: 0,
  48. SyncedQuota: 100000,
  49. Source: common.UserSourceSynced,
  50. AffCode: "SYNC1",
  51. }).Error)
  52. body := map[string]any{
  53. "id": 1001,
  54. "username": "synced-user",
  55. "display_name": "New Name",
  56. "password": "",
  57. "group": "default",
  58. "quota": 100000,
  59. }
  60. bodyBytes, err := json.Marshal(body)
  61. require.NoError(t, err)
  62. req := httptest.NewRequest(http.MethodPut, "/api/user/", bytes.NewBuffer(bodyBytes))
  63. req.Header.Set("Content-Type", "application/json")
  64. w := httptest.NewRecorder()
  65. router.ServeHTTP(w, req)
  66. require.Equal(t, http.StatusOK, w.Code)
  67. var resp map[string]any
  68. require.NoError(t, json.Unmarshal(w.Body.Bytes(), &resp))
  69. require.True(t, resp["success"].(bool))
  70. var saved model.User
  71. require.NoError(t, db.First(&saved, 1001).Error)
  72. require.Equal(t, "New Name", saved.DisplayName)
  73. require.Equal(t, 0, saved.Quota)
  74. require.Equal(t, 100000, saved.SyncedQuota)
  75. }
  76. func TestUpdateUser_SyncedUserQuotaChangeRejected(t *testing.T) {
  77. gin.SetMode(gin.TestMode)
  78. router := gin.New()
  79. router.Use(testRootAuthMiddleware())
  80. router.PUT("/api/user/", UpdateUser)
  81. db := setupUserControllerDB(t)
  82. orig := model.DB
  83. origRedisEnabled := common.RedisEnabled
  84. model.DB = db
  85. defer func() {
  86. model.DB = orig
  87. common.RedisEnabled = origRedisEnabled
  88. }()
  89. common.RedisEnabled = false
  90. require.NoError(t, db.Create(&model.User{
  91. Id: 1002,
  92. Username: "synced-user-2",
  93. Password: "hashed-password",
  94. DisplayName: "Synced User 2",
  95. Role: common.RoleCommonUser,
  96. Status: common.UserStatusEnabled,
  97. Group: "default",
  98. Quota: 0,
  99. SyncedQuota: 100000,
  100. Source: common.UserSourceSynced,
  101. AffCode: "SYNC2",
  102. }).Error)
  103. body := map[string]any{
  104. "id": 1002,
  105. "username": "synced-user-2",
  106. "display_name": "Synced User 2",
  107. "password": "",
  108. "group": "default",
  109. "quota": 100001,
  110. }
  111. bodyBytes, err := json.Marshal(body)
  112. require.NoError(t, err)
  113. req := httptest.NewRequest(http.MethodPut, "/api/user/", bytes.NewBuffer(bodyBytes))
  114. req.Header.Set("Content-Type", "application/json")
  115. w := httptest.NewRecorder()
  116. router.ServeHTTP(w, req)
  117. require.Equal(t, http.StatusOK, w.Code)
  118. var resp map[string]any
  119. require.NoError(t, json.Unmarshal(w.Body.Bytes(), &resp))
  120. require.False(t, resp["success"].(bool))
  121. require.Equal(t, "user.synced_user_quota_cannot_modify", resp["message"])
  122. var saved model.User
  123. require.NoError(t, db.First(&saved, 1002).Error)
  124. require.Equal(t, 0, saved.Quota)
  125. require.Equal(t, 100000, saved.SyncedQuota)
  126. }