gitea源码

api_repo_collaborator_test.go 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // Copyright 2022 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/perm"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. "code.gitea.io/gitea/models/unittest"
  11. user_model "code.gitea.io/gitea/models/user"
  12. api "code.gitea.io/gitea/modules/structs"
  13. "code.gitea.io/gitea/tests"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. func TestAPIRepoCollaboratorPermission(t *testing.T) {
  17. defer tests.PrepareTestEnv(t)()
  18. repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
  19. repo2Owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo2.OwnerID})
  20. user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
  21. user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
  22. user10 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
  23. user11 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 11})
  24. user34 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 34})
  25. testCtx := NewAPITestContext(t, repo2Owner.Name, repo2.Name, auth_model.AccessTokenScopeWriteRepository)
  26. t.Run("RepoOwnerShouldBeOwner", func(t *testing.T) {
  27. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, repo2Owner.Name).
  28. AddTokenAuth(testCtx.Token)
  29. resp := MakeRequest(t, req, http.StatusOK)
  30. var repoPermission api.RepoCollaboratorPermission
  31. DecodeJSON(t, resp, &repoPermission)
  32. assert.Equal(t, "owner", repoPermission.Permission)
  33. })
  34. t.Run("CollaboratorWithReadAccess", func(t *testing.T) {
  35. t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeRead))
  36. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name).
  37. AddTokenAuth(testCtx.Token)
  38. resp := MakeRequest(t, req, http.StatusOK)
  39. var repoPermission api.RepoCollaboratorPermission
  40. DecodeJSON(t, resp, &repoPermission)
  41. assert.Equal(t, "read", repoPermission.Permission)
  42. })
  43. t.Run("CollaboratorWithWriteAccess", func(t *testing.T) {
  44. t.Run("AddUserAsCollaboratorWithWriteAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeWrite))
  45. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name).
  46. AddTokenAuth(testCtx.Token)
  47. resp := MakeRequest(t, req, http.StatusOK)
  48. var repoPermission api.RepoCollaboratorPermission
  49. DecodeJSON(t, resp, &repoPermission)
  50. assert.Equal(t, "write", repoPermission.Permission)
  51. })
  52. t.Run("CollaboratorWithAdminAccess", func(t *testing.T) {
  53. t.Run("AddUserAsCollaboratorWithAdminAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeAdmin))
  54. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name).
  55. AddTokenAuth(testCtx.Token)
  56. resp := MakeRequest(t, req, http.StatusOK)
  57. var repoPermission api.RepoCollaboratorPermission
  58. DecodeJSON(t, resp, &repoPermission)
  59. assert.Equal(t, "admin", repoPermission.Permission)
  60. })
  61. t.Run("CollaboratorNotFound", func(t *testing.T) {
  62. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, "non-existent-user").
  63. AddTokenAuth(testCtx.Token)
  64. MakeRequest(t, req, http.StatusNotFound)
  65. })
  66. t.Run("CollaboratorBlocked", func(t *testing.T) {
  67. ctx := NewAPITestContext(t, repo2Owner.Name, repo2.Name, auth_model.AccessTokenScopeWriteRepository)
  68. ctx.ExpectedCode = http.StatusForbidden
  69. doAPIAddCollaborator(ctx, user34.Name, perm.AccessModeAdmin)(t)
  70. })
  71. t.Run("CollaboratorCanQueryItsPermissions", func(t *testing.T) {
  72. t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user5.Name, perm.AccessModeRead))
  73. _session := loginUser(t, user5.Name)
  74. _testCtx := NewAPITestContext(t, user5.Name, repo2.Name, auth_model.AccessTokenScopeReadRepository)
  75. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user5.Name).
  76. AddTokenAuth(_testCtx.Token)
  77. resp := _session.MakeRequest(t, req, http.StatusOK)
  78. var repoPermission api.RepoCollaboratorPermission
  79. DecodeJSON(t, resp, &repoPermission)
  80. assert.Equal(t, "read", repoPermission.Permission)
  81. t.Run("CollaboratorCanReadOwnPermission", func(t *testing.T) {
  82. session := loginUser(t, user5.Name)
  83. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
  84. req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user5.Name).AddTokenAuth(token)
  85. resp = MakeRequest(t, req, http.StatusOK)
  86. repoCollPerm := api.RepoCollaboratorPermission{}
  87. DecodeJSON(t, resp, &repoCollPerm)
  88. assert.Equal(t, "read", repoCollPerm.Permission)
  89. })
  90. })
  91. t.Run("CollaboratorCanQueryItsPermissions", func(t *testing.T) {
  92. t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user5.Name, perm.AccessModeRead))
  93. _session := loginUser(t, user5.Name)
  94. _testCtx := NewAPITestContext(t, user5.Name, repo2.Name, auth_model.AccessTokenScopeReadRepository)
  95. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user5.Name).
  96. AddTokenAuth(_testCtx.Token)
  97. resp := _session.MakeRequest(t, req, http.StatusOK)
  98. var repoPermission api.RepoCollaboratorPermission
  99. DecodeJSON(t, resp, &repoPermission)
  100. assert.Equal(t, "read", repoPermission.Permission)
  101. })
  102. t.Run("RepoAdminCanQueryACollaboratorsPermissions", func(t *testing.T) {
  103. t.Run("AddUserAsCollaboratorWithAdminAccess", doAPIAddCollaborator(testCtx, user10.Name, perm.AccessModeAdmin))
  104. t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user11.Name, perm.AccessModeRead))
  105. _session := loginUser(t, user10.Name)
  106. _testCtx := NewAPITestContext(t, user10.Name, repo2.Name, auth_model.AccessTokenScopeReadRepository)
  107. req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user11.Name).
  108. AddTokenAuth(_testCtx.Token)
  109. resp := _session.MakeRequest(t, req, http.StatusOK)
  110. var repoPermission api.RepoCollaboratorPermission
  111. DecodeJSON(t, resp, &repoPermission)
  112. assert.Equal(t, "read", repoPermission.Permission)
  113. })
  114. }