gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "net/http"
  6. "testing"
  7. auth_model "code.gitea.io/gitea/models/auth"
  8. "code.gitea.io/gitea/models/unittest"
  9. user_model "code.gitea.io/gitea/models/user"
  10. api "code.gitea.io/gitea/modules/structs"
  11. "code.gitea.io/gitea/tests"
  12. "github.com/stretchr/testify/assert"
  13. )
  14. type SearchResults struct {
  15. OK bool `json:"ok"`
  16. Data []*api.User `json:"data"`
  17. }
  18. func TestAPIUserSearchLoggedIn(t *testing.T) {
  19. defer tests.PrepareTestEnv(t)()
  20. adminUsername := "user1"
  21. session := loginUser(t, adminUsername)
  22. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser)
  23. query := "user2"
  24. req := NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query).
  25. AddTokenAuth(token)
  26. resp := MakeRequest(t, req, http.StatusOK)
  27. var results SearchResults
  28. DecodeJSON(t, resp, &results)
  29. assert.NotEmpty(t, results.Data)
  30. for _, user := range results.Data {
  31. assert.Contains(t, user.UserName, query)
  32. assert.NotEmpty(t, user.Email)
  33. }
  34. publicToken := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser, auth_model.AccessTokenScopePublicOnly)
  35. req = NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query).
  36. AddTokenAuth(publicToken)
  37. resp = MakeRequest(t, req, http.StatusOK)
  38. results = SearchResults{}
  39. DecodeJSON(t, resp, &results)
  40. assert.NotEmpty(t, results.Data)
  41. for _, user := range results.Data {
  42. assert.Contains(t, user.UserName, query)
  43. assert.NotEmpty(t, user.Email)
  44. assert.Equal(t, "public", user.Visibility)
  45. }
  46. }
  47. func TestAPIUserSearchNotLoggedIn(t *testing.T) {
  48. defer tests.PrepareTestEnv(t)()
  49. query := "user2"
  50. req := NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query)
  51. resp := MakeRequest(t, req, http.StatusOK)
  52. var results SearchResults
  53. DecodeJSON(t, resp, &results)
  54. assert.NotEmpty(t, results.Data)
  55. var modelUser *user_model.User
  56. for _, user := range results.Data {
  57. assert.Contains(t, user.UserName, query)
  58. modelUser = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: user.ID})
  59. assert.Equal(t, modelUser.GetPlaceholderEmail(), user.Email)
  60. }
  61. }
  62. func TestAPIUserSearchSystemUsers(t *testing.T) {
  63. defer tests.PrepareTestEnv(t)()
  64. for _, systemUser := range []*user_model.User{
  65. user_model.NewGhostUser(),
  66. user_model.NewActionsUser(),
  67. } {
  68. t.Run(systemUser.Name, func(t *testing.T) {
  69. req := NewRequestf(t, "GET", "/api/v1/users/search?uid=%d", systemUser.ID)
  70. resp := MakeRequest(t, req, http.StatusOK)
  71. var results SearchResults
  72. DecodeJSON(t, resp, &results)
  73. assert.NotEmpty(t, results.Data)
  74. if assert.Len(t, results.Data, 1) {
  75. user := results.Data[0]
  76. assert.Equal(t, user.UserName, systemUser.Name)
  77. assert.Equal(t, user.ID, systemUser.ID)
  78. }
  79. })
  80. }
  81. }
  82. func TestAPIUserSearchAdminLoggedInUserHidden(t *testing.T) {
  83. defer tests.PrepareTestEnv(t)()
  84. adminUsername := "user1"
  85. session := loginUser(t, adminUsername)
  86. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser)
  87. query := "user31"
  88. req := NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query).
  89. AddTokenAuth(token)
  90. resp := MakeRequest(t, req, http.StatusOK)
  91. var results SearchResults
  92. DecodeJSON(t, resp, &results)
  93. assert.NotEmpty(t, results.Data)
  94. for _, user := range results.Data {
  95. assert.Contains(t, user.UserName, query)
  96. assert.NotEmpty(t, user.Email)
  97. assert.Equal(t, "private", user.Visibility)
  98. }
  99. }
  100. func TestAPIUserSearchNotLoggedInUserHidden(t *testing.T) {
  101. defer tests.PrepareTestEnv(t)()
  102. query := "user31"
  103. req := NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query)
  104. resp := MakeRequest(t, req, http.StatusOK)
  105. var results SearchResults
  106. DecodeJSON(t, resp, &results)
  107. assert.Empty(t, results.Data)
  108. }
  109. func TestAPIUserSearchByEmail(t *testing.T) {
  110. defer tests.PrepareTestEnv(t)()
  111. // admin can search user with private email
  112. adminUsername := "user1"
  113. session := loginUser(t, adminUsername)
  114. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser)
  115. query := "user2@example.com"
  116. req := NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query).
  117. AddTokenAuth(token)
  118. resp := MakeRequest(t, req, http.StatusOK)
  119. var results SearchResults
  120. DecodeJSON(t, resp, &results)
  121. assert.Len(t, results.Data, 1)
  122. assert.Equal(t, query, results.Data[0].Email)
  123. // no login user can not search user with private email
  124. req = NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query)
  125. resp = MakeRequest(t, req, http.StatusOK)
  126. DecodeJSON(t, resp, &results)
  127. assert.Empty(t, results.Data)
  128. // user can search self with private email
  129. user2 := "user2"
  130. session = loginUser(t, user2)
  131. token = getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser)
  132. req = NewRequestf(t, "GET", "/api/v1/users/search?q=%s", query).
  133. AddTokenAuth(token)
  134. resp = MakeRequest(t, req, http.StatusOK)
  135. DecodeJSON(t, resp, &results)
  136. assert.Len(t, results.Data, 1)
  137. assert.Equal(t, query, results.Data[0].Email)
  138. }