gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // Copyright 2022 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/unittest"
  10. user_model "code.gitea.io/gitea/models/user"
  11. "code.gitea.io/gitea/modules/setting"
  12. api "code.gitea.io/gitea/modules/structs"
  13. "code.gitea.io/gitea/modules/test"
  14. "code.gitea.io/gitea/tests"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. func TestAPIStar(t *testing.T) {
  18. defer tests.PrepareTestEnv(t)()
  19. user := "user1"
  20. repo := "user2/repo1"
  21. session := loginUser(t, user)
  22. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser)
  23. tokenWithUserScope := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser, auth_model.AccessTokenScopeWriteRepository)
  24. t.Run("Star", func(t *testing.T) {
  25. defer tests.PrintCurrentTest(t)()
  26. req := NewRequest(t, "PUT", "/api/v1/user/starred/"+repo).
  27. AddTokenAuth(tokenWithUserScope)
  28. MakeRequest(t, req, http.StatusNoContent)
  29. // blocked user can't star a repo
  30. user34 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 34})
  31. req = NewRequest(t, "PUT", "/api/v1/user/starred/"+repo).
  32. AddTokenAuth(getUserToken(t, user34.Name, auth_model.AccessTokenScopeWriteRepository))
  33. MakeRequest(t, req, http.StatusForbidden)
  34. })
  35. t.Run("GetStarredRepos", func(t *testing.T) {
  36. defer tests.PrintCurrentTest(t)()
  37. req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/users/%s/starred", user)).
  38. AddTokenAuth(token)
  39. resp := MakeRequest(t, req, http.StatusOK)
  40. assert.Equal(t, "1", resp.Header().Get("X-Total-Count"))
  41. var repos []api.Repository
  42. DecodeJSON(t, resp, &repos)
  43. assert.Len(t, repos, 1)
  44. assert.Equal(t, repo, repos[0].FullName)
  45. })
  46. t.Run("GetMyStarredRepos", func(t *testing.T) {
  47. defer tests.PrintCurrentTest(t)()
  48. req := NewRequest(t, "GET", "/api/v1/user/starred").
  49. AddTokenAuth(tokenWithUserScope)
  50. resp := MakeRequest(t, req, http.StatusOK)
  51. assert.Equal(t, "1", resp.Header().Get("X-Total-Count"))
  52. var repos []api.Repository
  53. DecodeJSON(t, resp, &repos)
  54. assert.Len(t, repos, 1)
  55. assert.Equal(t, repo, repos[0].FullName)
  56. })
  57. t.Run("IsStarring", func(t *testing.T) {
  58. defer tests.PrintCurrentTest(t)()
  59. req := NewRequest(t, "GET", "/api/v1/user/starred/"+repo).
  60. AddTokenAuth(tokenWithUserScope)
  61. MakeRequest(t, req, http.StatusNoContent)
  62. req = NewRequest(t, "GET", "/api/v1/user/starred/"+repo+"notexisting").
  63. AddTokenAuth(tokenWithUserScope)
  64. MakeRequest(t, req, http.StatusNotFound)
  65. })
  66. t.Run("Unstar", func(t *testing.T) {
  67. defer tests.PrintCurrentTest(t)()
  68. req := NewRequest(t, "DELETE", "/api/v1/user/starred/"+repo).
  69. AddTokenAuth(tokenWithUserScope)
  70. MakeRequest(t, req, http.StatusNoContent)
  71. })
  72. }
  73. func TestAPIStarDisabled(t *testing.T) {
  74. defer tests.PrepareTestEnv(t)()
  75. user := "user1"
  76. repo := "user2/repo1"
  77. session := loginUser(t, user)
  78. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadUser)
  79. tokenWithUserScope := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteUser, auth_model.AccessTokenScopeWriteRepository)
  80. defer test.MockVariableValue(&setting.Repository.DisableStars, true)()
  81. t.Run("Star", func(t *testing.T) {
  82. defer tests.PrintCurrentTest(t)()
  83. req := NewRequest(t, "PUT", "/api/v1/user/starred/"+repo).
  84. AddTokenAuth(tokenWithUserScope)
  85. MakeRequest(t, req, http.StatusForbidden)
  86. user34 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 34})
  87. req = NewRequest(t, "PUT", "/api/v1/user/starred/"+repo).
  88. AddTokenAuth(getUserToken(t, user34.Name, auth_model.AccessTokenScopeWriteRepository))
  89. MakeRequest(t, req, http.StatusForbidden)
  90. })
  91. t.Run("GetStarredRepos", func(t *testing.T) {
  92. defer tests.PrintCurrentTest(t)()
  93. req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/users/%s/starred", user)).
  94. AddTokenAuth(token)
  95. MakeRequest(t, req, http.StatusForbidden)
  96. })
  97. t.Run("GetMyStarredRepos", func(t *testing.T) {
  98. defer tests.PrintCurrentTest(t)()
  99. req := NewRequest(t, "GET", "/api/v1/user/starred").
  100. AddTokenAuth(tokenWithUserScope)
  101. MakeRequest(t, req, http.StatusForbidden)
  102. })
  103. t.Run("IsStarring", func(t *testing.T) {
  104. defer tests.PrintCurrentTest(t)()
  105. req := NewRequest(t, "GET", "/api/v1/user/starred/"+repo).
  106. AddTokenAuth(tokenWithUserScope)
  107. MakeRequest(t, req, http.StatusForbidden)
  108. req = NewRequest(t, "GET", "/api/v1/user/starred/"+repo+"notexisting").
  109. AddTokenAuth(tokenWithUserScope)
  110. MakeRequest(t, req, http.StatusForbidden)
  111. })
  112. t.Run("Unstar", func(t *testing.T) {
  113. defer tests.PrintCurrentTest(t)()
  114. req := NewRequest(t, "DELETE", "/api/v1/user/starred/"+repo).
  115. AddTokenAuth(tokenWithUserScope)
  116. MakeRequest(t, req, http.StatusForbidden)
  117. })
  118. }