You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

pull_update_test.go 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. "code.gitea.io/gitea/models/db"
  12. issues_model "code.gitea.io/gitea/models/issues"
  13. "code.gitea.io/gitea/models/unittest"
  14. user_model "code.gitea.io/gitea/models/user"
  15. "code.gitea.io/gitea/modules/git"
  16. pull_service "code.gitea.io/gitea/services/pull"
  17. repo_service "code.gitea.io/gitea/services/repository"
  18. files_service "code.gitea.io/gitea/services/repository/files"
  19. "github.com/stretchr/testify/assert"
  20. )
  21. func TestAPIPullUpdate(t *testing.T) {
  22. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  23. // Create PR to test
  24. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  25. org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26})
  26. pr := createOutdatedPR(t, user, org26)
  27. // Test GetDiverging
  28. diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr)
  29. assert.NoError(t, err)
  30. assert.EqualValues(t, 1, diffCount.Behind)
  31. assert.EqualValues(t, 1, diffCount.Ahead)
  32. assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
  33. assert.NoError(t, pr.LoadIssue(db.DefaultContext))
  34. session := loginUser(t, "user2")
  35. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  36. req := NewRequestf(t, "POST", "/api/v1/repos/%s/%s/pulls/%d/update?token="+token, pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index)
  37. session.MakeRequest(t, req, http.StatusOK)
  38. // Test GetDiverging after update
  39. diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr)
  40. assert.NoError(t, err)
  41. assert.EqualValues(t, 0, diffCount.Behind)
  42. assert.EqualValues(t, 2, diffCount.Ahead)
  43. })
  44. }
  45. func TestAPIPullUpdateByRebase(t *testing.T) {
  46. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  47. // Create PR to test
  48. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  49. org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26})
  50. pr := createOutdatedPR(t, user, org26)
  51. // Test GetDiverging
  52. diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr)
  53. assert.NoError(t, err)
  54. assert.EqualValues(t, 1, diffCount.Behind)
  55. assert.EqualValues(t, 1, diffCount.Ahead)
  56. assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
  57. assert.NoError(t, pr.LoadIssue(db.DefaultContext))
  58. session := loginUser(t, "user2")
  59. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  60. req := NewRequestf(t, "POST", "/api/v1/repos/%s/%s/pulls/%d/update?style=rebase&token="+token, pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index)
  61. session.MakeRequest(t, req, http.StatusOK)
  62. // Test GetDiverging after update
  63. diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr)
  64. assert.NoError(t, err)
  65. assert.EqualValues(t, 0, diffCount.Behind)
  66. assert.EqualValues(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(db.DefaultContext, 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(git.DefaultContext, 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(git.DefaultContext, 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. Name: actor.Name,
  102. Email: actor.Email,
  103. },
  104. Committer: &files_service.IdentityOptions{
  105. Name: actor.Name,
  106. Email: 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(git.DefaultContext, 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. Name: actor.Name,
  128. Email: actor.Email,
  129. },
  130. Committer: &files_service.IdentityOptions{
  131. Name: actor.Name,
  132. Email: 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. err = pull_service.NewPullRequest(git.DefaultContext, baseRepo, pullIssue, nil, nil, pullRequest, nil)
  158. assert.NoError(t, err)
  159. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{Title: "Test Pull -to-update-"})
  160. pr, err := issues_model.GetPullRequestByIssueID(db.DefaultContext, issue.ID)
  161. assert.NoError(t, err)
  162. return pr
  163. }