gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "fmt"
  6. "net/http"
  7. "testing"
  8. repo_model "code.gitea.io/gitea/models/repo"
  9. "code.gitea.io/gitea/models/unittest"
  10. "code.gitea.io/gitea/modules/setting"
  11. "code.gitea.io/gitea/modules/test"
  12. "code.gitea.io/gitea/modules/translation"
  13. "code.gitea.io/gitea/tests"
  14. "github.com/PuerkitoBio/goquery"
  15. "github.com/stretchr/testify/assert"
  16. )
  17. func createNewRelease(t *testing.T, session *TestSession, repoURL, tag, title string, preRelease, draft bool) {
  18. req := NewRequest(t, "GET", repoURL+"/releases/new")
  19. resp := session.MakeRequest(t, req, http.StatusOK)
  20. htmlDoc := NewHTMLParser(t, resp.Body)
  21. link, exists := htmlDoc.doc.Find("form.ui.form").Attr("action")
  22. assert.True(t, exists, "The template has changed")
  23. postData := map[string]string{
  24. "_csrf": htmlDoc.GetCSRF(),
  25. "tag_name": tag,
  26. "tag_target": "master",
  27. "title": title,
  28. "content": "",
  29. }
  30. if preRelease {
  31. postData["prerelease"] = "on"
  32. }
  33. if draft {
  34. postData["draft"] = "1"
  35. }
  36. req = NewRequestWithValues(t, "POST", link, postData)
  37. resp = session.MakeRequest(t, req, http.StatusSeeOther)
  38. test.RedirectURL(resp) // check that redirect URL exists
  39. }
  40. func checkLatestReleaseAndCount(t *testing.T, session *TestSession, repoURL, version, label string, count int) {
  41. req := NewRequest(t, "GET", repoURL+"/releases")
  42. resp := session.MakeRequest(t, req, http.StatusOK)
  43. htmlDoc := NewHTMLParser(t, resp.Body)
  44. labelText := htmlDoc.doc.Find("#release-list > li .detail .label").First().Text()
  45. assert.Equal(t, label, labelText)
  46. titleText := htmlDoc.doc.Find("#release-list > li .detail h4 a").First().Text()
  47. assert.Equal(t, version, titleText)
  48. releaseList := htmlDoc.doc.Find("#release-list > li")
  49. assert.Equal(t, count, releaseList.Length())
  50. }
  51. func TestViewReleases(t *testing.T) {
  52. defer tests.PrepareTestEnv(t)()
  53. session := loginUser(t, "user2")
  54. req := NewRequest(t, "GET", "/user2/repo1/releases")
  55. session.MakeRequest(t, req, http.StatusOK)
  56. }
  57. func TestViewReleasesNoLogin(t *testing.T) {
  58. defer tests.PrepareTestEnv(t)()
  59. req := NewRequest(t, "GET", "/user2/repo1/releases")
  60. MakeRequest(t, req, http.StatusOK)
  61. }
  62. func TestCreateRelease(t *testing.T) {
  63. defer tests.PrepareTestEnv(t)()
  64. session := loginUser(t, "user2")
  65. createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, false)
  66. checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", translation.NewLocale("en-US").TrString("repo.release.stable"), 4)
  67. }
  68. func TestCreateReleasePreRelease(t *testing.T) {
  69. defer tests.PrepareTestEnv(t)()
  70. session := loginUser(t, "user2")
  71. createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", true, false)
  72. checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", translation.NewLocale("en-US").TrString("repo.release.prerelease"), 4)
  73. }
  74. func TestCreateReleaseDraft(t *testing.T) {
  75. defer tests.PrepareTestEnv(t)()
  76. session := loginUser(t, "user2")
  77. createNewRelease(t, session, "/user2/repo1", "v0.0.1", "v0.0.1", false, true)
  78. checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.1", translation.NewLocale("en-US").TrString("repo.release.draft"), 4)
  79. }
  80. func TestCreateReleasePaging(t *testing.T) {
  81. defer tests.PrepareTestEnv(t)()
  82. oldAPIDefaultNum := setting.API.DefaultPagingNum
  83. defer func() {
  84. setting.API.DefaultPagingNum = oldAPIDefaultNum
  85. }()
  86. setting.API.DefaultPagingNum = 10
  87. session := loginUser(t, "user2")
  88. // Create enough releases to have paging
  89. for i := range 12 {
  90. version := fmt.Sprintf("v0.0.%d", i)
  91. createNewRelease(t, session, "/user2/repo1", version, version, false, false)
  92. }
  93. createNewRelease(t, session, "/user2/repo1", "v0.0.12", "v0.0.12", false, true)
  94. checkLatestReleaseAndCount(t, session, "/user2/repo1", "v0.0.12", translation.NewLocale("en-US").TrString("repo.release.draft"), 10)
  95. // Check that user4 does not see draft and still see 10 latest releases
  96. session2 := loginUser(t, "user4")
  97. checkLatestReleaseAndCount(t, session2, "/user2/repo1", "v0.0.11", translation.NewLocale("en-US").TrString("repo.release.stable"), 10)
  98. }
  99. func TestViewReleaseListNoLogin(t *testing.T) {
  100. defer tests.PrepareTestEnv(t)()
  101. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 57, OwnerName: "user2", LowerName: "repo-release"})
  102. link := repo.Link() + "/releases"
  103. req := NewRequest(t, "GET", link)
  104. rsp := MakeRequest(t, req, http.StatusOK)
  105. htmlDoc := NewHTMLParser(t, rsp.Body)
  106. releases := htmlDoc.Find("#release-list .release-entry")
  107. assert.Equal(t, 5, releases.Length())
  108. links := make([]string, 0, 5)
  109. commitsToMain := make([]string, 0, 5)
  110. releases.Each(func(i int, s *goquery.Selection) {
  111. link, exist := s.Find(".release-list-title a").Attr("href")
  112. if !exist {
  113. return
  114. }
  115. links = append(links, link)
  116. commitsToMain = append(commitsToMain, s.Find(".ahead > a").Text())
  117. })
  118. assert.Equal(t, []string{
  119. "/user2/repo-release/releases/tag/empty-target-branch",
  120. "/user2/repo-release/releases/tag/non-existing-target-branch",
  121. "/user2/repo-release/releases/tag/v2.0",
  122. "/user2/repo-release/releases/tag/v1.1",
  123. "/user2/repo-release/releases/tag/v1.0",
  124. }, links)
  125. assert.Equal(t, []string{
  126. "1 commits", // like v1.1
  127. "1 commits", // like v1.1
  128. "0 commits",
  129. "1 commits", // should be 3 commits ahead and 2 commits behind, but not implemented yet
  130. "3 commits",
  131. }, commitsToMain)
  132. }
  133. func TestViewSingleRelease(t *testing.T) {
  134. defer tests.PrepareTestEnv(t)()
  135. t.Run("NoLogin", func(t *testing.T) {
  136. req := NewRequest(t, "GET", "/user2/repo-release/releases/tag/v1.0")
  137. resp := MakeRequest(t, req, http.StatusOK)
  138. htmlDoc := NewHTMLParser(t, resp.Body)
  139. // check the "number of commits to main since this release"
  140. releaseList := htmlDoc.doc.Find("#release-list .ahead > a")
  141. assert.Equal(t, 1, releaseList.Length())
  142. assert.Equal(t, "3 commits", releaseList.First().Text())
  143. })
  144. t.Run("Login", func(t *testing.T) {
  145. session := loginUser(t, "user1")
  146. req := NewRequest(t, "GET", "/user2/repo1/releases/tag/delete-tag") // "delete-tag" is the only one with is_tag=true (although strange name)
  147. resp := session.MakeRequest(t, req, http.StatusOK)
  148. // the New Release button should contain the tag name
  149. assert.Contains(t, resp.Body.String(), `<a class="ui small primary button" href="/user2/repo1/releases/new?tag=delete-tag">`)
  150. })
  151. }
  152. func TestViewReleaseListLogin(t *testing.T) {
  153. defer tests.PrepareTestEnv(t)()
  154. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  155. link := repo.Link() + "/releases"
  156. session := loginUser(t, "user1")
  157. req := NewRequest(t, "GET", link)
  158. rsp := session.MakeRequest(t, req, http.StatusOK)
  159. htmlDoc := NewHTMLParser(t, rsp.Body)
  160. releases := htmlDoc.Find("#release-list .release-entry")
  161. assert.Equal(t, 3, releases.Length())
  162. links := make([]string, 0, 5)
  163. releases.Each(func(i int, s *goquery.Selection) {
  164. link, exist := s.Find(".release-list-title a").Attr("href")
  165. if !exist {
  166. return
  167. }
  168. links = append(links, link)
  169. })
  170. assert.Equal(t, []string{
  171. "/user2/repo1/releases/tag/draft-release",
  172. "/user2/repo1/releases/tag/v1.0",
  173. "/user2/repo1/releases/tag/v1.1",
  174. }, links)
  175. }
  176. func TestViewTagsList(t *testing.T) {
  177. defer tests.PrepareTestEnv(t)()
  178. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
  179. link := repo.Link() + "/tags"
  180. session := loginUser(t, "user1")
  181. req := NewRequest(t, "GET", link)
  182. rsp := session.MakeRequest(t, req, http.StatusOK)
  183. htmlDoc := NewHTMLParser(t, rsp.Body)
  184. tags := htmlDoc.Find(".tag-list-row-link")
  185. assert.Equal(t, 3, tags.Length())
  186. tagNames := make([]string, 0, 5)
  187. tags.Each(func(i int, s *goquery.Selection) {
  188. tagNames = append(tagNames, s.Text())
  189. })
  190. assert.Equal(t, []string{"v1.0", "delete-tag", "v1.1"}, tagNames)
  191. }
  192. func TestDownloadReleaseAttachment(t *testing.T) {
  193. defer tests.PrepareTestEnv(t)()
  194. tests.PrepareAttachmentsStorage(t)
  195. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
  196. url := repo.Link() + "/releases/download/v1.1/README.md"
  197. req := NewRequest(t, "GET", url)
  198. MakeRequest(t, req, http.StatusNotFound)
  199. req = NewRequest(t, "GET", url)
  200. session := loginUser(t, "user2")
  201. session.MakeRequest(t, req, http.StatusOK)
  202. }