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

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. "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", pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index).
  37. AddTokenAuth(token)
  38. session.MakeRequest(t, req, http.StatusOK)
  39. // Test GetDiverging after update
  40. diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr)
  41. assert.NoError(t, err)
  42. assert.EqualValues(t, 0, diffCount.Behind)
  43. assert.EqualValues(t, 2, diffCount.Ahead)
  44. })
  45. }
  46. func TestAPIPullUpdateByRebase(t *testing.T) {
  47. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  48. // Create PR to test
  49. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  50. org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26})
  51. pr := createOutdatedPR(t, user, org26)
  52. // Test GetDiverging
  53. diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr)
  54. assert.NoError(t, err)
  55. assert.EqualValues(t, 1, diffCount.Behind)
  56. assert.EqualValues(t, 1, diffCount.Ahead)
  57. assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
  58. assert.NoError(t, pr.LoadIssue(db.DefaultContext))
  59. session := loginUser(t, "user2")
  60. token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
  61. req := NewRequestf(t, "POST", "/api/v1/repos/%s/%s/pulls/%d/update?style=rebase", pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index).
  62. AddTokenAuth(token)
  63. session.MakeRequest(t, req, http.StatusOK)
  64. // Test GetDiverging after update
  65. diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr)
  66. assert.NoError(t, err)
  67. assert.EqualValues(t, 0, diffCount.Behind)
  68. assert.EqualValues(t, 1, diffCount.Ahead)
  69. })
  70. }
  71. func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_model.PullRequest {
  72. baseRepo, err := repo_service.CreateRepository(db.DefaultContext, actor, actor, repo_service.CreateRepoOptions{
  73. Name: "repo-pr-update",
  74. Description: "repo-tmp-pr-update description",
  75. AutoInit: true,
  76. Gitignores: "C,C++",
  77. License: "MIT",
  78. Readme: "Default",
  79. IsPrivate: false,
  80. })
  81. assert.NoError(t, err)
  82. assert.NotEmpty(t, baseRepo)
  83. headRepo, err := repo_service.ForkRepository(git.DefaultContext, actor, forkOrg, repo_service.ForkRepoOptions{
  84. BaseRepo: baseRepo,
  85. Name: "repo-pr-update",
  86. Description: "desc",
  87. })
  88. assert.NoError(t, err)
  89. assert.NotEmpty(t, headRepo)
  90. // create a commit on base Repo
  91. _, err = files_service.ChangeRepoFiles(git.DefaultContext, baseRepo, actor, &files_service.ChangeRepoFilesOptions{
  92. Files: []*files_service.ChangeRepoFile{
  93. {
  94. Operation: "create",
  95. TreePath: "File_A",
  96. ContentReader: strings.NewReader("File A"),
  97. },
  98. },
  99. Message: "Add File A",
  100. OldBranch: "master",
  101. NewBranch: "master",
  102. Author: &files_service.IdentityOptions{
  103. Name: actor.Name,
  104. Email: actor.Email,
  105. },
  106. Committer: &files_service.IdentityOptions{
  107. Name: actor.Name,
  108. Email: actor.Email,
  109. },
  110. Dates: &files_service.CommitDateOptions{
  111. Author: time.Now(),
  112. Committer: time.Now(),
  113. },
  114. })
  115. assert.NoError(t, err)
  116. // create a commit on head Repo
  117. _, err = files_service.ChangeRepoFiles(git.DefaultContext, headRepo, actor, &files_service.ChangeRepoFilesOptions{
  118. Files: []*files_service.ChangeRepoFile{
  119. {
  120. Operation: "create",
  121. TreePath: "File_B",
  122. ContentReader: strings.NewReader("File B"),
  123. },
  124. },
  125. Message: "Add File on PR branch",
  126. OldBranch: "master",
  127. NewBranch: "newBranch",
  128. Author: &files_service.IdentityOptions{
  129. Name: actor.Name,
  130. Email: actor.Email,
  131. },
  132. Committer: &files_service.IdentityOptions{
  133. Name: actor.Name,
  134. Email: actor.Email,
  135. },
  136. Dates: &files_service.CommitDateOptions{
  137. Author: time.Now(),
  138. Committer: time.Now(),
  139. },
  140. })
  141. assert.NoError(t, err)
  142. // create Pull
  143. pullIssue := &issues_model.Issue{
  144. RepoID: baseRepo.ID,
  145. Title: "Test Pull -to-update-",
  146. PosterID: actor.ID,
  147. Poster: actor,
  148. IsPull: true,
  149. }
  150. pullRequest := &issues_model.PullRequest{
  151. HeadRepoID: headRepo.ID,
  152. BaseRepoID: baseRepo.ID,
  153. HeadBranch: "newBranch",
  154. BaseBranch: "master",
  155. HeadRepo: headRepo,
  156. BaseRepo: baseRepo,
  157. Type: issues_model.PullRequestGitea,
  158. }
  159. err = pull_service.NewPullRequest(git.DefaultContext, baseRepo, pullIssue, nil, nil, pullRequest, nil)
  160. assert.NoError(t, err)
  161. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{Title: "Test Pull -to-update-"})
  162. assert.NoError(t, issue.LoadPullRequest(db.DefaultContext))
  163. return issue.PullRequest
  164. }