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.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. "testing"
  8. "time"
  9. "code.gitea.io/gitea/models/db"
  10. issues_model "code.gitea.io/gitea/models/issues"
  11. "code.gitea.io/gitea/models/unittest"
  12. user_model "code.gitea.io/gitea/models/user"
  13. "code.gitea.io/gitea/modules/git"
  14. repo_module "code.gitea.io/gitea/modules/repository"
  15. pull_service "code.gitea.io/gitea/services/pull"
  16. repo_service "code.gitea.io/gitea/services/repository"
  17. files_service "code.gitea.io/gitea/services/repository/files"
  18. "github.com/stretchr/testify/assert"
  19. )
  20. func TestAPIPullUpdate(t *testing.T) {
  21. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  22. // Create PR to test
  23. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  24. org26 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 26})
  25. pr := createOutdatedPR(t, user, org26)
  26. // Test GetDiverging
  27. diffCount, err := pull_service.GetDiverging(git.DefaultContext, pr)
  28. assert.NoError(t, err)
  29. assert.EqualValues(t, 1, diffCount.Behind)
  30. assert.EqualValues(t, 1, diffCount.Ahead)
  31. assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
  32. assert.NoError(t, pr.LoadIssue(db.DefaultContext))
  33. session := loginUser(t, "user2")
  34. token := getTokenForLoggedInUser(t, session)
  35. req := NewRequestf(t, "POST", "/api/v1/repos/%s/%s/pulls/%d/update?token="+token, pr.BaseRepo.OwnerName, pr.BaseRepo.Name, pr.Issue.Index)
  36. session.MakeRequest(t, req, http.StatusOK)
  37. // Test GetDiverging after update
  38. diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr)
  39. assert.NoError(t, err)
  40. assert.EqualValues(t, 0, diffCount.Behind)
  41. assert.EqualValues(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(git.DefaultContext, pr)
  52. assert.NoError(t, err)
  53. assert.EqualValues(t, 1, diffCount.Behind)
  54. assert.EqualValues(t, 1, diffCount.Ahead)
  55. assert.NoError(t, pr.LoadBaseRepo(db.DefaultContext))
  56. assert.NoError(t, pr.LoadIssue(db.DefaultContext))
  57. session := loginUser(t, "user2")
  58. token := getTokenForLoggedInUser(t, session)
  59. 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)
  60. session.MakeRequest(t, req, http.StatusOK)
  61. // Test GetDiverging after update
  62. diffCount, err = pull_service.GetDiverging(git.DefaultContext, pr)
  63. assert.NoError(t, err)
  64. assert.EqualValues(t, 0, diffCount.Behind)
  65. assert.EqualValues(t, 1, diffCount.Ahead)
  66. })
  67. }
  68. func createOutdatedPR(t *testing.T, actor, forkOrg *user_model.User) *issues_model.PullRequest {
  69. baseRepo, err := repo_service.CreateRepository(actor, actor, repo_module.CreateRepoOptions{
  70. Name: "repo-pr-update",
  71. Description: "repo-tmp-pr-update description",
  72. AutoInit: true,
  73. Gitignores: "C,C++",
  74. License: "MIT",
  75. Readme: "Default",
  76. IsPrivate: false,
  77. })
  78. assert.NoError(t, err)
  79. assert.NotEmpty(t, baseRepo)
  80. headRepo, err := repo_service.ForkRepository(git.DefaultContext, actor, forkOrg, repo_service.ForkRepoOptions{
  81. BaseRepo: baseRepo,
  82. Name: "repo-pr-update",
  83. Description: "desc",
  84. })
  85. assert.NoError(t, err)
  86. assert.NotEmpty(t, headRepo)
  87. // create a commit on base Repo
  88. _, err = files_service.CreateOrUpdateRepoFile(git.DefaultContext, baseRepo, actor, &files_service.UpdateRepoFileOptions{
  89. TreePath: "File_A",
  90. Message: "Add File A",
  91. Content: "File A",
  92. IsNewFile: true,
  93. OldBranch: "master",
  94. NewBranch: "master",
  95. Author: &files_service.IdentityOptions{
  96. Name: actor.Name,
  97. Email: actor.Email,
  98. },
  99. Committer: &files_service.IdentityOptions{
  100. Name: actor.Name,
  101. Email: actor.Email,
  102. },
  103. Dates: &files_service.CommitDateOptions{
  104. Author: time.Now(),
  105. Committer: time.Now(),
  106. },
  107. })
  108. assert.NoError(t, err)
  109. // create a commit on head Repo
  110. _, err = files_service.CreateOrUpdateRepoFile(git.DefaultContext, headRepo, actor, &files_service.UpdateRepoFileOptions{
  111. TreePath: "File_B",
  112. Message: "Add File on PR branch",
  113. Content: "File B",
  114. IsNewFile: true,
  115. OldBranch: "master",
  116. NewBranch: "newBranch",
  117. Author: &files_service.IdentityOptions{
  118. Name: actor.Name,
  119. Email: actor.Email,
  120. },
  121. Committer: &files_service.IdentityOptions{
  122. Name: actor.Name,
  123. Email: actor.Email,
  124. },
  125. Dates: &files_service.CommitDateOptions{
  126. Author: time.Now(),
  127. Committer: time.Now(),
  128. },
  129. })
  130. assert.NoError(t, err)
  131. // create Pull
  132. pullIssue := &issues_model.Issue{
  133. RepoID: baseRepo.ID,
  134. Title: "Test Pull -to-update-",
  135. PosterID: actor.ID,
  136. Poster: actor,
  137. IsPull: true,
  138. }
  139. pullRequest := &issues_model.PullRequest{
  140. HeadRepoID: headRepo.ID,
  141. BaseRepoID: baseRepo.ID,
  142. HeadBranch: "newBranch",
  143. BaseBranch: "master",
  144. HeadRepo: headRepo,
  145. BaseRepo: baseRepo,
  146. Type: issues_model.PullRequestGitea,
  147. }
  148. err = pull_service.NewPullRequest(git.DefaultContext, baseRepo, pullIssue, nil, nil, pullRequest, nil)
  149. assert.NoError(t, err)
  150. issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{Title: "Test Pull -to-update-"})
  151. pr, err := issues_model.GetPullRequestByIssueID(db.DefaultContext, issue.ID)
  152. assert.NoError(t, err)
  153. return pr
  154. }