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

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