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.

release_test.go 7.7KB

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