gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Copyright 2017 The Gogs 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. org_model "code.gitea.io/gitea/models/organization"
  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. org_service "code.gitea.io/gitea/services/org"
  14. "code.gitea.io/gitea/tests"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. func TestCreateForkNoLogin(t *testing.T) {
  18. defer tests.PrepareTestEnv(t)()
  19. req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{})
  20. MakeRequest(t, req, http.StatusUnauthorized)
  21. }
  22. func TestAPIForkListLimitedAndPrivateRepos(t *testing.T) {
  23. defer tests.PrepareTestEnv(t)()
  24. user1Sess := loginUser(t, "user1")
  25. user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"})
  26. // fork into a limited org
  27. limitedOrg := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 22})
  28. assert.Equal(t, api.VisibleTypeLimited, limitedOrg.Visibility)
  29. ownerTeam1, err := org_model.OrgFromUser(limitedOrg).GetOwnerTeam(t.Context())
  30. assert.NoError(t, err)
  31. assert.NoError(t, org_service.AddTeamMember(t.Context(), ownerTeam1, user1))
  32. user1Token := getTokenForLoggedInUser(t, user1Sess, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteOrganization)
  33. req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{
  34. Organization: &limitedOrg.Name,
  35. }).AddTokenAuth(user1Token)
  36. MakeRequest(t, req, http.StatusAccepted)
  37. // fork into a private org
  38. user4Sess := loginUser(t, "user4")
  39. user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user4"})
  40. privateOrg := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 23})
  41. assert.Equal(t, api.VisibleTypePrivate, privateOrg.Visibility)
  42. ownerTeam2, err := org_model.OrgFromUser(privateOrg).GetOwnerTeam(t.Context())
  43. assert.NoError(t, err)
  44. assert.NoError(t, org_service.AddTeamMember(t.Context(), ownerTeam2, user4))
  45. user4Token := getTokenForLoggedInUser(t, user4Sess, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteOrganization)
  46. req = NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{
  47. Organization: &privateOrg.Name,
  48. }).AddTokenAuth(user4Token)
  49. MakeRequest(t, req, http.StatusAccepted)
  50. t.Run("Anonymous", func(t *testing.T) {
  51. defer tests.PrintCurrentTest(t)()
  52. req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/forks")
  53. resp := MakeRequest(t, req, http.StatusOK)
  54. var forks []*api.Repository
  55. DecodeJSON(t, resp, &forks)
  56. assert.Empty(t, forks)
  57. assert.Equal(t, "0", resp.Header().Get("X-Total-Count"))
  58. })
  59. t.Run("Logged in", func(t *testing.T) {
  60. defer tests.PrintCurrentTest(t)()
  61. req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/forks").AddTokenAuth(user1Token)
  62. resp := MakeRequest(t, req, http.StatusOK)
  63. var forks []*api.Repository
  64. DecodeJSON(t, resp, &forks)
  65. assert.Len(t, forks, 2)
  66. assert.Equal(t, "2", resp.Header().Get("X-Total-Count"))
  67. assert.NoError(t, org_service.AddTeamMember(t.Context(), ownerTeam2, user1))
  68. req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/forks").AddTokenAuth(user1Token)
  69. resp = MakeRequest(t, req, http.StatusOK)
  70. forks = []*api.Repository{}
  71. DecodeJSON(t, resp, &forks)
  72. assert.Len(t, forks, 2)
  73. assert.Equal(t, "2", resp.Header().Get("X-Total-Count"))
  74. })
  75. }
  76. func TestGetPrivateReposForks(t *testing.T) {
  77. defer tests.PrepareTestEnv(t)()
  78. user1Sess := loginUser(t, "user1")
  79. repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) // private repository
  80. privateOrg := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 23})
  81. user1Token := getTokenForLoggedInUser(t, user1Sess, auth_model.AccessTokenScopeWriteRepository)
  82. forkedRepoName := "forked-repo"
  83. // create fork from a private repository
  84. req := NewRequestWithJSON(t, "POST", "/api/v1/repos/"+repo2.FullName()+"/forks", &api.CreateForkOption{
  85. Organization: &privateOrg.Name,
  86. Name: &forkedRepoName,
  87. }).AddTokenAuth(user1Token)
  88. MakeRequest(t, req, http.StatusAccepted)
  89. // test get a private fork without clear permissions
  90. req = NewRequest(t, "GET", "/api/v1/repos/"+repo2.FullName()+"/forks").AddTokenAuth(user1Token)
  91. resp := MakeRequest(t, req, http.StatusOK)
  92. forks := []*api.Repository{}
  93. DecodeJSON(t, resp, &forks)
  94. assert.Len(t, forks, 1)
  95. assert.Equal(t, "1", resp.Header().Get("X-Total-Count"))
  96. assert.Equal(t, "forked-repo", forks[0].Name)
  97. assert.Equal(t, privateOrg.Name, forks[0].Owner.UserName)
  98. }