gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "net/http"
  6. "net/url"
  7. "strings"
  8. "testing"
  9. "time"
  10. auth_model "code.gitea.io/gitea/models/auth"
  11. issues_model "code.gitea.io/gitea/models/issues"
  12. "code.gitea.io/gitea/models/unittest"
  13. user_model "code.gitea.io/gitea/models/user"
  14. pull_service "code.gitea.io/gitea/services/pull"
  15. repo_service "code.gitea.io/gitea/services/repository"
  16. files_service "code.gitea.io/gitea/services/repository/files"
  17. "github.com/stretchr/testify/assert"
  18. )
  19. func TestAPIPullUpdate(t *testing.T) {
  20. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  21. // Create PR to test
  22. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  23. org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26})
  24. pr := createOutdatedPR(t, user, org26)
  25. // Test GetDiverging
  26. diffCount, err := pull_service.GetDiverging(t.Context(), pr)
  27. assert.NoError(t, err)
  28. assert.Equal(t, 1, diffCount.Behind)
  29. assert.Equal(t, 1, diffCount.Ahead)
  30. assert.NoError(t, pr.LoadBaseRepo(t.Context()))
  31. assert.NoError(t, pr.LoadIssue(t.Context()))
  32. session := loginUser(t, "user2")
  33. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  34. req := NewRequestf(t, "POST", "/api/v1/repos/%s/%s/pulls/%d/update", pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index).
  35. AddTokenAuth(token)
  36. session.MakeRequest(t, req, http.StatusOK)
  37. // Test GetDiverging after update
  38. diffCount, err = pull_service.GetDiverging(t.Context(), pr)
  39. assert.NoError(t, err)
  40. assert.Equal(t, 0, diffCount.Behind)
  41. assert.Equal(t, 2, diffCount.Ahead)
  42. })
  43. }
  44. func TestAPIPullUpdateByRebase(t *testing.T) {
  45. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  46. // Create PR to test
  47. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  48. org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26})
  49. pr := createOutdatedPR(t, user, org26)
  50. // Test GetDiverging
  51. diffCount, err := pull_service.GetDiverging(t.Context(), pr)
  52. assert.NoError(t, err)
  53. assert.Equal(t, 1, diffCount.Behind)
  54. assert.Equal(t, 1, diffCount.Ahead)
  55. assert.NoError(t, pr.LoadBaseRepo(t.Context()))
  56. assert.NoError(t, pr.LoadIssue(t.Context()))
  57. session := loginUser(t, "user2")
  58. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  59. req := NewRequestf(t, "POST", "/api/v1/repos/%s/%s/pulls/%d/update?style=rebase", pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index).
  60. AddTokenAuth(token)
  61. session.MakeRequest(t, req, http.StatusOK)
  62. // Test GetDiverging after update
  63. diffCount, err = pull_service.GetDiverging(t.Context(), pr)
  64. assert.NoError(t, err)
  65. assert.Equal(t, 0, diffCount.Behind)
  66. assert.Equal(t, 1, diffCount.Ahead)
  67. })
  68. }
  69. func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_model.PullRequest {
  70. baseRepo, err := repo_service.CreateRepository(t.Context(), actor, actor, repo_service.CreateRepoOptions{
  71. Name: "repo-pr-update",
  72. Description: "repo-tmp-pr-update description",
  73. AutoInit: true,
  74. Gitignores: "C,C++",
  75. License: "MIT",
  76. Readme: "Default",
  77. IsPrivate: false,
  78. })
  79. assert.NoError(t, err)
  80. assert.NotEmpty(t, baseRepo)
  81. headRepo, err := repo_service.ForkRepository(t.Context(), actor, forkOrg, repo_service.ForkRepoOptions{
  82. BaseRepo: baseRepo,
  83. Name: "repo-pr-update",
  84. Description: "desc",
  85. })
  86. assert.NoError(t, err)
  87. assert.NotEmpty(t, headRepo)
  88. // create a commit on base Repo
  89. _, err = files_service.ChangeRepoFiles(t.Context(), baseRepo, actor, &files_service.ChangeRepoFilesOptions{
  90. Files: []*files_service.ChangeRepoFile{
  91. {
  92. Operation: "create",
  93. TreePath: "File_A",
  94. ContentReader: strings.NewReader("File A"),
  95. },
  96. },
  97. Message: "Add File A",
  98. OldBranch: "master",
  99. NewBranch: "master",
  100. Author: &files_service.IdentityOptions{
  101. GitUserName: actor.Name,
  102. GitUserEmail: actor.Email,
  103. },
  104. Committer: &files_service.IdentityOptions{
  105. GitUserName: actor.Name,
  106. GitUserEmail: actor.Email,
  107. },
  108. Dates: &files_service.CommitDateOptions{
  109. Author: time.Now(),
  110. Committer: time.Now(),
  111. },
  112. })
  113. assert.NoError(t, err)
  114. // create a commit on head Repo
  115. _, err = files_service.ChangeRepoFiles(t.Context(), headRepo, actor, &files_service.ChangeRepoFilesOptions{
  116. Files: []*files_service.ChangeRepoFile{
  117. {
  118. Operation: "create",
  119. TreePath: "File_B",
  120. ContentReader: strings.NewReader("File B"),
  121. },
  122. },
  123. Message: "Add File on PR branch",
  124. OldBranch: "master",
  125. NewBranch: "newBranch",
  126. Author: &files_service.IdentityOptions{
  127. GitUserName: actor.Name,
  128. GitUserEmail: actor.Email,
  129. },
  130. Committer: &files_service.IdentityOptions{
  131. GitUserName: actor.Name,
  132. GitUserEmail: actor.Email,
  133. },
  134. Dates: &files_service.CommitDateOptions{
  135. Author: time.Now(),
  136. Committer: time.Now(),
  137. },
  138. })
  139. assert.NoError(t, err)
  140. // create Pull
  141. pullIssue := &issues_model.Issue{
  142. RepoID: baseRepo.ID,
  143. Title: "Test Pull -to-update-",
  144. PosterID: actor.ID,
  145. Poster: actor,
  146. IsPull: true,
  147. }
  148. pullRequest := &issues_model.PullRequest{
  149. HeadRepoID: headRepo.ID,
  150. BaseRepoID: baseRepo.ID,
  151. HeadBranch: "newBranch",
  152. BaseBranch: "master",
  153. HeadRepo: headRepo,
  154. BaseRepo: baseRepo,
  155. Type: issues_model.PullRequestGitea,
  156. }
  157. prOpts := &pull_service.NewPullRequestOptions{Repo: baseRepo, Issue: pullIssue, PullRequest: pullRequest}
  158. err = pull_service.NewPullRequest(t.Context(), prOpts)
  159. assert.NoError(t, err)
  160. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{Title: "Test Pull -to-update-"})
  161. assert.NoError(t, issue.LoadPullRequest(t.Context()))
  162. return issue.PullRequest
  163. }