Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

pull_merge_test.go 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. // Copyright 2017 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/http/httptest"
  8. "net/url"
  9. "path"
  10. "strings"
  11. "testing"
  12. "code.gitea.io/gitea/models"
  13. "code.gitea.io/gitea/modules/test"
  14. "github.com/Unknwon/i18n"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. func testPullMerge(t *testing.T, session *TestSession, user, repo, pullnum string, mergeStyle models.MergeStyle) *httptest.ResponseRecorder {
  18. req := NewRequest(t, "GET", path.Join(user, repo, "pulls", pullnum))
  19. resp := session.MakeRequest(t, req, http.StatusOK)
  20. // Click the little green button to create a pull
  21. htmlDoc := NewHTMLParser(t, resp.Body)
  22. link, exists := htmlDoc.doc.Find(".ui.form." + string(mergeStyle) + "-fields > form").Attr("action")
  23. assert.True(t, exists, "The template has changed")
  24. req = NewRequestWithValues(t, "POST", link, map[string]string{
  25. "_csrf": htmlDoc.GetCSRF(),
  26. "do": string(mergeStyle),
  27. })
  28. resp = session.MakeRequest(t, req, http.StatusFound)
  29. return resp
  30. }
  31. func testPullCleanUp(t *testing.T, session *TestSession, user, repo, pullnum string) *httptest.ResponseRecorder {
  32. req := NewRequest(t, "GET", path.Join(user, repo, "pulls", pullnum))
  33. resp := session.MakeRequest(t, req, http.StatusOK)
  34. // Click the little green button to create a pull
  35. htmlDoc := NewHTMLParser(t, resp.Body)
  36. link, exists := htmlDoc.doc.Find(".comments .merge .delete-button").Attr("data-url")
  37. assert.True(t, exists, "The template has changed")
  38. req = NewRequestWithValues(t, "POST", link, map[string]string{
  39. "_csrf": htmlDoc.GetCSRF(),
  40. })
  41. resp = session.MakeRequest(t, req, http.StatusOK)
  42. return resp
  43. }
  44. func TestPullMerge(t *testing.T) {
  45. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  46. hookTasks, err := models.HookTasks(1, 1) //Retrieve previous hook number
  47. assert.NoError(t, err)
  48. hookTasksLenBefore := len(hookTasks)
  49. session := loginUser(t, "user1")
  50. testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
  51. testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n")
  52. resp := testPullCreate(t, session, "user1", "repo1", "master", "This is a pull title")
  53. elem := strings.Split(test.RedirectURL(resp), "/")
  54. assert.EqualValues(t, "pulls", elem[3])
  55. testPullMerge(t, session, elem[1], elem[2], elem[4], models.MergeStyleMerge)
  56. hookTasks, err = models.HookTasks(1, 1)
  57. assert.NoError(t, err)
  58. assert.Len(t, hookTasks, hookTasksLenBefore+1)
  59. })
  60. }
  61. func TestPullRebase(t *testing.T) {
  62. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  63. hookTasks, err := models.HookTasks(1, 1) //Retrieve previous hook number
  64. assert.NoError(t, err)
  65. hookTasksLenBefore := len(hookTasks)
  66. session := loginUser(t, "user1")
  67. testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
  68. testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n")
  69. resp := testPullCreate(t, session, "user1", "repo1", "master", "This is a pull title")
  70. elem := strings.Split(test.RedirectURL(resp), "/")
  71. assert.EqualValues(t, "pulls", elem[3])
  72. testPullMerge(t, session, elem[1], elem[2], elem[4], models.MergeStyleRebase)
  73. hookTasks, err = models.HookTasks(1, 1)
  74. assert.NoError(t, err)
  75. assert.Len(t, hookTasks, hookTasksLenBefore+1)
  76. })
  77. }
  78. func TestPullRebaseMerge(t *testing.T) {
  79. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  80. prepareTestEnv(t)
  81. hookTasks, err := models.HookTasks(1, 1) //Retrieve previous hook number
  82. assert.NoError(t, err)
  83. hookTasksLenBefore := len(hookTasks)
  84. session := loginUser(t, "user1")
  85. testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
  86. testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n")
  87. resp := testPullCreate(t, session, "user1", "repo1", "master", "This is a pull title")
  88. elem := strings.Split(test.RedirectURL(resp), "/")
  89. assert.EqualValues(t, "pulls", elem[3])
  90. testPullMerge(t, session, elem[1], elem[2], elem[4], models.MergeStyleRebaseMerge)
  91. hookTasks, err = models.HookTasks(1, 1)
  92. assert.NoError(t, err)
  93. assert.Len(t, hookTasks, hookTasksLenBefore+1)
  94. })
  95. }
  96. func TestPullSquash(t *testing.T) {
  97. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  98. prepareTestEnv(t)
  99. hookTasks, err := models.HookTasks(1, 1) //Retrieve previous hook number
  100. assert.NoError(t, err)
  101. hookTasksLenBefore := len(hookTasks)
  102. session := loginUser(t, "user1")
  103. testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
  104. testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n")
  105. testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited!)\n")
  106. resp := testPullCreate(t, session, "user1", "repo1", "master", "This is a pull title")
  107. elem := strings.Split(test.RedirectURL(resp), "/")
  108. assert.EqualValues(t, "pulls", elem[3])
  109. testPullMerge(t, session, elem[1], elem[2], elem[4], models.MergeStyleSquash)
  110. hookTasks, err = models.HookTasks(1, 1)
  111. assert.NoError(t, err)
  112. assert.Len(t, hookTasks, hookTasksLenBefore+1)
  113. })
  114. }
  115. func TestPullCleanUpAfterMerge(t *testing.T) {
  116. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  117. prepareTestEnv(t)
  118. session := loginUser(t, "user1")
  119. testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
  120. testEditFileToNewBranch(t, session, "user1", "repo1", "master", "feature/test", "README.md", "Hello, World (Edited)\n")
  121. resp := testPullCreate(t, session, "user1", "repo1", "feature/test", "This is a pull title")
  122. elem := strings.Split(test.RedirectURL(resp), "/")
  123. assert.EqualValues(t, "pulls", elem[3])
  124. testPullMerge(t, session, elem[1], elem[2], elem[4], models.MergeStyleMerge)
  125. // Check PR branch deletion
  126. resp = testPullCleanUp(t, session, elem[1], elem[2], elem[4])
  127. respJSON := struct {
  128. Redirect string
  129. }{}
  130. DecodeJSON(t, resp, &respJSON)
  131. assert.NotEmpty(t, respJSON.Redirect, "Redirected URL is not found")
  132. elem = strings.Split(respJSON.Redirect, "/")
  133. assert.EqualValues(t, "pulls", elem[3])
  134. // Check branch deletion result
  135. req := NewRequest(t, "GET", respJSON.Redirect)
  136. resp = session.MakeRequest(t, req, http.StatusOK)
  137. htmlDoc := NewHTMLParser(t, resp.Body)
  138. resultMsg := htmlDoc.doc.Find(".ui.message>p").Text()
  139. assert.EqualValues(t, "Branch 'user1/feature/test' has been deleted.", resultMsg)
  140. })
  141. }
  142. func TestCantMergeWorkInProgress(t *testing.T) {
  143. onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
  144. prepareTestEnv(t)
  145. session := loginUser(t, "user1")
  146. testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
  147. testEditFile(t, session, "user1", "repo1", "master", "README.md", "Hello, World (Edited)\n")
  148. resp := testPullCreate(t, session, "user1", "repo1", "master", "[wip] This is a pull title")
  149. req := NewRequest(t, "GET", resp.Header().Get("Location"))
  150. resp = session.MakeRequest(t, req, http.StatusOK)
  151. htmlDoc := NewHTMLParser(t, resp.Body)
  152. text := strings.TrimSpace(htmlDoc.doc.Find(".attached.header > .text.grey").Last().Text())
  153. assert.NotEmpty(t, text, "Can't find WIP text")
  154. // remove <strong /> from lang
  155. expected := i18n.Tr("en", "repo.pulls.cannot_merge_work_in_progress", "[wip]")
  156. replacer := strings.NewReplacer("<strong>", "", "</strong>", "")
  157. assert.Equal(t, replacer.Replace(expected), text, "Unable to find WIP text")
  158. })
  159. }