gitea源码

api_user_block_test.go 8.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "fmt"
  6. "net/http"
  7. "testing"
  8. auth_model "code.gitea.io/gitea/models/auth"
  9. "code.gitea.io/gitea/models/db"
  10. issues_model "code.gitea.io/gitea/models/issues"
  11. repo_model "code.gitea.io/gitea/models/repo"
  12. api "code.gitea.io/gitea/modules/structs"
  13. "code.gitea.io/gitea/tests"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. func TestBlockUser(t *testing.T) {
  17. defer tests.PrepareTestEnv(t)()
  18. countStars := func(t *testing.T, repoOwnerID, starrerID int64) int64 {
  19. count, err := db.Count[repo_model.Repository](t.Context(), &repo_model.StarredReposOptions{
  20. StarrerID: starrerID,
  21. RepoOwnerID: repoOwnerID,
  22. IncludePrivate: true,
  23. })
  24. assert.NoError(t, err)
  25. return count
  26. }
  27. countWatches := func(t *testing.T, repoOwnerID, watcherID int64) int64 {
  28. count, err := db.Count[repo_model.Repository](t.Context(), &repo_model.WatchedReposOptions{
  29. WatcherID: watcherID,
  30. RepoOwnerID: repoOwnerID,
  31. })
  32. assert.NoError(t, err)
  33. return count
  34. }
  35. countRepositoryTransfers := func(t *testing.T, senderID, recipientID int64) int64 {
  36. transfers, err := repo_model.GetPendingRepositoryTransfers(t.Context(), &repo_model.PendingRepositoryTransferOptions{
  37. SenderID: senderID,
  38. RecipientID: recipientID,
  39. })
  40. assert.NoError(t, err)
  41. return int64(len(transfers))
  42. }
  43. countAssignedIssues := func(t *testing.T, repoOwnerID, assigneeID int64) int64 {
  44. _, count, err := issues_model.GetAssignedIssues(t.Context(), &issues_model.AssignedIssuesOptions{
  45. AssigneeID: assigneeID,
  46. RepoOwnerID: repoOwnerID,
  47. })
  48. assert.NoError(t, err)
  49. return count
  50. }
  51. countCollaborations := func(t *testing.T, repoOwnerID, collaboratorID int64) int64 {
  52. count, err := db.Count[repo_model.Collaboration](t.Context(), &repo_model.FindCollaborationOptions{
  53. CollaboratorID: collaboratorID,
  54. RepoOwnerID: repoOwnerID,
  55. })
  56. assert.NoError(t, err)
  57. return count
  58. }
  59. t.Run("User", func(t *testing.T) {
  60. var blockerID int64 = 16
  61. blockerName := "user16"
  62. blockerToken := getUserToken(t, blockerName, auth_model.AccessTokenScopeWriteUser)
  63. var blockeeID int64 = 10
  64. blockeeName := "user10"
  65. t.Run("Block", func(t *testing.T) {
  66. req := NewRequest(t, "PUT", "/api/v1/user/blocks/"+blockeeName)
  67. MakeRequest(t, req, http.StatusUnauthorized)
  68. assert.EqualValues(t, 1, countStars(t, blockerID, blockeeID))
  69. assert.EqualValues(t, 1, countWatches(t, blockerID, blockeeID))
  70. assert.EqualValues(t, 1, countRepositoryTransfers(t, blockerID, blockeeID))
  71. assert.EqualValues(t, 1, countCollaborations(t, blockerID, blockeeID))
  72. req = NewRequest(t, "GET", "/api/v1/user/blocks/"+blockeeName).
  73. AddTokenAuth(blockerToken)
  74. MakeRequest(t, req, http.StatusNotFound)
  75. req = NewRequest(t, "PUT", fmt.Sprintf("/api/v1/user/blocks/%s?reason=test", blockeeName)).
  76. AddTokenAuth(blockerToken)
  77. MakeRequest(t, req, http.StatusNoContent)
  78. assert.EqualValues(t, 0, countStars(t, blockerID, blockeeID))
  79. assert.EqualValues(t, 0, countWatches(t, blockerID, blockeeID))
  80. assert.EqualValues(t, 0, countRepositoryTransfers(t, blockerID, blockeeID))
  81. assert.EqualValues(t, 0, countCollaborations(t, blockerID, blockeeID))
  82. req = NewRequest(t, "GET", "/api/v1/user/blocks/"+blockeeName).
  83. AddTokenAuth(blockerToken)
  84. MakeRequest(t, req, http.StatusNoContent)
  85. req = NewRequest(t, "PUT", "/api/v1/user/blocks/"+blockeeName).
  86. AddTokenAuth(blockerToken)
  87. MakeRequest(t, req, http.StatusBadRequest) // can't block blocked user
  88. req = NewRequest(t, "PUT", "/api/v1/user/blocks/"+"org3").
  89. AddTokenAuth(blockerToken)
  90. MakeRequest(t, req, http.StatusBadRequest) // can't block organization
  91. req = NewRequest(t, "GET", "/api/v1/user/blocks")
  92. MakeRequest(t, req, http.StatusUnauthorized)
  93. req = NewRequest(t, "GET", "/api/v1/user/blocks").
  94. AddTokenAuth(blockerToken)
  95. resp := MakeRequest(t, req, http.StatusOK)
  96. var users []api.User
  97. DecodeJSON(t, resp, &users)
  98. assert.Len(t, users, 1)
  99. assert.Equal(t, blockeeName, users[0].UserName)
  100. })
  101. t.Run("Unblock", func(t *testing.T) {
  102. req := NewRequest(t, "DELETE", "/api/v1/user/blocks/"+blockeeName)
  103. MakeRequest(t, req, http.StatusUnauthorized)
  104. req = NewRequest(t, "DELETE", "/api/v1/user/blocks/"+blockeeName).
  105. AddTokenAuth(blockerToken)
  106. MakeRequest(t, req, http.StatusNoContent)
  107. req = NewRequest(t, "DELETE", "/api/v1/user/blocks/"+blockeeName).
  108. AddTokenAuth(blockerToken)
  109. MakeRequest(t, req, http.StatusBadRequest)
  110. req = NewRequest(t, "DELETE", "/api/v1/user/blocks/"+"org3").
  111. AddTokenAuth(blockerToken)
  112. MakeRequest(t, req, http.StatusBadRequest)
  113. req = NewRequest(t, "GET", "/api/v1/user/blocks").
  114. AddTokenAuth(blockerToken)
  115. resp := MakeRequest(t, req, http.StatusOK)
  116. var users []api.User
  117. DecodeJSON(t, resp, &users)
  118. assert.Empty(t, users)
  119. })
  120. })
  121. t.Run("Organization", func(t *testing.T) {
  122. var blockerID int64 = 3
  123. blockerName := "org3"
  124. doerToken := getUserToken(t, "user2", auth_model.AccessTokenScopeWriteUser, auth_model.AccessTokenScopeWriteOrganization)
  125. var blockeeID int64 = 10
  126. blockeeName := "user10"
  127. t.Run("Block", func(t *testing.T) {
  128. req := NewRequest(t, "PUT", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, blockeeName))
  129. MakeRequest(t, req, http.StatusUnauthorized)
  130. req = NewRequest(t, "PUT", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, "user4")).
  131. AddTokenAuth(doerToken)
  132. MakeRequest(t, req, http.StatusBadRequest) // can't block member
  133. assert.EqualValues(t, 1, countStars(t, blockerID, blockeeID))
  134. assert.EqualValues(t, 1, countWatches(t, blockerID, blockeeID))
  135. assert.EqualValues(t, 1, countRepositoryTransfers(t, blockerID, blockeeID))
  136. assert.EqualValues(t, 1, countAssignedIssues(t, blockerID, blockeeID))
  137. assert.EqualValues(t, 1, countCollaborations(t, blockerID, blockeeID))
  138. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, blockeeName)).
  139. AddTokenAuth(doerToken)
  140. MakeRequest(t, req, http.StatusNotFound)
  141. req = NewRequest(t, "PUT", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s?reason=test", blockerName, blockeeName)).
  142. AddTokenAuth(doerToken)
  143. MakeRequest(t, req, http.StatusNoContent)
  144. assert.EqualValues(t, 0, countStars(t, blockerID, blockeeID))
  145. assert.EqualValues(t, 0, countWatches(t, blockerID, blockeeID))
  146. assert.EqualValues(t, 0, countRepositoryTransfers(t, blockerID, blockeeID))
  147. assert.EqualValues(t, 0, countAssignedIssues(t, blockerID, blockeeID))
  148. assert.EqualValues(t, 0, countCollaborations(t, blockerID, blockeeID))
  149. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, blockeeName)).
  150. AddTokenAuth(doerToken)
  151. MakeRequest(t, req, http.StatusNoContent)
  152. req = NewRequest(t, "PUT", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, blockeeName)).
  153. AddTokenAuth(doerToken)
  154. MakeRequest(t, req, http.StatusBadRequest) // can't block blocked user
  155. req = NewRequest(t, "PUT", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, "org3")).
  156. AddTokenAuth(doerToken)
  157. MakeRequest(t, req, http.StatusBadRequest) // can't block organization
  158. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/orgs/%s/blocks", blockerName))
  159. MakeRequest(t, req, http.StatusUnauthorized)
  160. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/orgs/%s/blocks", blockerName)).
  161. AddTokenAuth(doerToken)
  162. resp := MakeRequest(t, req, http.StatusOK)
  163. var users []api.User
  164. DecodeJSON(t, resp, &users)
  165. assert.Len(t, users, 1)
  166. assert.Equal(t, blockeeName, users[0].UserName)
  167. })
  168. t.Run("Unblock", func(t *testing.T) {
  169. req := NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, blockeeName))
  170. MakeRequest(t, req, http.StatusUnauthorized)
  171. req = NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, blockeeName)).
  172. AddTokenAuth(doerToken)
  173. MakeRequest(t, req, http.StatusNoContent)
  174. req = NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, blockeeName)).
  175. AddTokenAuth(doerToken)
  176. MakeRequest(t, req, http.StatusBadRequest)
  177. req = NewRequest(t, "DELETE", fmt.Sprintf("/api/v1/orgs/%s/blocks/%s", blockerName, "org3")).
  178. AddTokenAuth(doerToken)
  179. MakeRequest(t, req, http.StatusBadRequest)
  180. req = NewRequest(t, "GET", fmt.Sprintf("/api/v1/orgs/%s/blocks", blockerName)).
  181. AddTokenAuth(doerToken)
  182. resp := MakeRequest(t, req, http.StatusOK)
  183. var users []api.User
  184. DecodeJSON(t, resp, &users)
  185. assert.Empty(t, users)
  186. })
  187. })
  188. }