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.

repo_branch_test.go 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  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/url"
  8. "path"
  9. "strings"
  10. "testing"
  11. "code.gitea.io/gitea/modules/setting"
  12. "code.gitea.io/gitea/modules/test"
  13. "github.com/stretchr/testify/assert"
  14. "github.com/unknwon/i18n"
  15. )
  16. func testCreateBranch(t testing.TB, session *TestSession, user, repo, oldRefSubURL, newBranchName string, expectedStatus int) string {
  17. var csrf string
  18. if expectedStatus == http.StatusNotFound {
  19. csrf = GetCSRF(t, session, path.Join(user, repo, "src/branch/master"))
  20. } else {
  21. csrf = GetCSRF(t, session, path.Join(user, repo, "src", oldRefSubURL))
  22. }
  23. req := NewRequestWithValues(t, "POST", path.Join(user, repo, "branches/_new", oldRefSubURL), map[string]string{
  24. "_csrf": csrf,
  25. "new_branch_name": newBranchName,
  26. })
  27. resp := session.MakeRequest(t, req, expectedStatus)
  28. if expectedStatus != http.StatusFound {
  29. return ""
  30. }
  31. return test.RedirectURL(resp)
  32. }
  33. func TestCreateBranch(t *testing.T) {
  34. onGiteaRun(t, testCreateBranches)
  35. }
  36. func testCreateBranches(t *testing.T, giteaURL *url.URL) {
  37. tests := []struct {
  38. OldRefSubURL string
  39. NewBranch string
  40. CreateRelease string
  41. FlashMessage string
  42. ExpectedStatus int
  43. }{
  44. {
  45. OldRefSubURL: "branch/master",
  46. NewBranch: "feature/test1",
  47. ExpectedStatus: http.StatusFound,
  48. FlashMessage: i18n.Tr("en", "repo.branch.create_success", "feature/test1"),
  49. },
  50. {
  51. OldRefSubURL: "branch/master",
  52. NewBranch: "",
  53. ExpectedStatus: http.StatusFound,
  54. FlashMessage: i18n.Tr("en", "form.NewBranchName") + i18n.Tr("en", "form.require_error"),
  55. },
  56. {
  57. OldRefSubURL: "branch/master",
  58. NewBranch: "feature=test1",
  59. ExpectedStatus: http.StatusFound,
  60. FlashMessage: i18n.Tr("en", "repo.branch.create_success", "feature=test1"),
  61. },
  62. {
  63. OldRefSubURL: "branch/master",
  64. NewBranch: strings.Repeat("b", 101),
  65. ExpectedStatus: http.StatusFound,
  66. FlashMessage: i18n.Tr("en", "form.NewBranchName") + i18n.Tr("en", "form.max_size_error", "100"),
  67. },
  68. {
  69. OldRefSubURL: "branch/master",
  70. NewBranch: "master",
  71. ExpectedStatus: http.StatusFound,
  72. FlashMessage: i18n.Tr("en", "repo.branch.branch_already_exists", "master"),
  73. },
  74. {
  75. OldRefSubURL: "branch/master",
  76. NewBranch: "master/test",
  77. ExpectedStatus: http.StatusFound,
  78. FlashMessage: i18n.Tr("en", "repo.branch.branch_name_conflict", "master/test", "master"),
  79. },
  80. {
  81. OldRefSubURL: "commit/acd1d892867872cb47f3993468605b8aa59aa2e0",
  82. NewBranch: "feature/test2",
  83. ExpectedStatus: http.StatusNotFound,
  84. },
  85. {
  86. OldRefSubURL: "commit/65f1bf27bc3bf70f64657658635e66094edbcb4d",
  87. NewBranch: "feature/test3",
  88. ExpectedStatus: http.StatusFound,
  89. FlashMessage: i18n.Tr("en", "repo.branch.create_success", "feature/test3"),
  90. },
  91. {
  92. OldRefSubURL: "branch/master",
  93. NewBranch: "v1.0.0",
  94. CreateRelease: "v1.0.0",
  95. ExpectedStatus: http.StatusFound,
  96. FlashMessage: i18n.Tr("en", "repo.branch.tag_collision", "v1.0.0"),
  97. },
  98. {
  99. OldRefSubURL: "tag/v1.0.0",
  100. NewBranch: "feature/test4",
  101. CreateRelease: "v1.0.1",
  102. ExpectedStatus: http.StatusFound,
  103. FlashMessage: i18n.Tr("en", "repo.branch.create_success", "feature/test4"),
  104. },
  105. }
  106. for _, test := range tests {
  107. session := loginUser(t, "user2")
  108. if test.CreateRelease != "" {
  109. createNewRelease(t, session, "/user2/repo1", test.CreateRelease, test.CreateRelease, false, false)
  110. }
  111. redirectURL := testCreateBranch(t, session, "user2", "repo1", test.OldRefSubURL, test.NewBranch, test.ExpectedStatus)
  112. if test.ExpectedStatus == http.StatusFound {
  113. req := NewRequest(t, "GET", redirectURL)
  114. resp := session.MakeRequest(t, req, http.StatusOK)
  115. htmlDoc := NewHTMLParser(t, resp.Body)
  116. assert.Equal(t,
  117. test.FlashMessage,
  118. strings.TrimSpace(htmlDoc.doc.Find(".ui.message").Text()),
  119. )
  120. }
  121. }
  122. }
  123. func TestCreateBranchInvalidCSRF(t *testing.T) {
  124. defer prepareTestEnv(t)()
  125. session := loginUser(t, "user2")
  126. req := NewRequestWithValues(t, "POST", "user2/repo1/branches/_new/branch/master", map[string]string{
  127. "_csrf": "fake_csrf",
  128. "new_branch_name": "test",
  129. })
  130. resp := session.MakeRequest(t, req, http.StatusFound)
  131. loc := resp.Header().Get("Location")
  132. assert.Equal(t, setting.AppSubURL+"/", loc)
  133. resp = session.MakeRequest(t, NewRequest(t, "GET", loc), http.StatusOK)
  134. htmlDoc := NewHTMLParser(t, resp.Body)
  135. assert.Equal(t,
  136. "Bad Request: Invalid CSRF token",
  137. strings.TrimSpace(htmlDoc.doc.Find(".ui.message").Text()),
  138. )
  139. }