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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. "fmt"
  7. "net/http"
  8. "testing"
  9. "time"
  10. repo_model "code.gitea.io/gitea/models/repo"
  11. "code.gitea.io/gitea/models/unittest"
  12. "code.gitea.io/gitea/modules/setting"
  13. "code.gitea.io/gitea/modules/test"
  14. "code.gitea.io/gitea/modules/translation/i18n"
  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 .meta .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 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 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 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", i18n.Tr("en", "repo.release.stable"), 4)
  70. }
  71. func TestCreateReleasePreRelease(t *testing.T) {
  72. defer 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", i18n.Tr("en", "repo.release.prerelease"), 4)
  76. }
  77. func TestCreateReleaseDraft(t *testing.T) {
  78. defer 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", i18n.Tr("en", "repo.release.draft"), 4)
  82. }
  83. func TestCreateReleasePaging(t *testing.T) {
  84. defer 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", i18n.Tr("en", "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", i18n.Tr("en", "repo.release.stable"), 10)
  101. }
  102. func TestViewReleaseListNoLogin(t *testing.T) {
  103. defer prepareTestEnv(t)()
  104. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  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, 2, releases.Length())
  111. links := make([]string, 0, 5)
  112. releases.Each(func(i int, s *goquery.Selection) {
  113. link, exist := s.Find(".release-list-title a").Attr("href")
  114. if !exist {
  115. return
  116. }
  117. links = append(links, link)
  118. })
  119. assert.EqualValues(t, []string{"/user2/repo1/releases/tag/v1.0", "/user2/repo1/releases/tag/v1.1"}, links)
  120. }
  121. func TestViewReleaseListLogin(t *testing.T) {
  122. defer prepareTestEnv(t)()
  123. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  124. link := repo.Link() + "/releases"
  125. session := loginUser(t, "user1")
  126. req := NewRequest(t, "GET", link)
  127. rsp := session.MakeRequest(t, req, http.StatusOK)
  128. htmlDoc := NewHTMLParser(t, rsp.Body)
  129. releases := htmlDoc.Find("#release-list li.ui.grid")
  130. assert.Equal(t, 3, releases.Length())
  131. links := make([]string, 0, 5)
  132. releases.Each(func(i int, s *goquery.Selection) {
  133. link, exist := s.Find(".release-list-title a").Attr("href")
  134. if !exist {
  135. return
  136. }
  137. links = append(links, link)
  138. })
  139. assert.EqualValues(t, []string{
  140. "/user2/repo1/releases/tag/draft-release",
  141. "/user2/repo1/releases/tag/v1.0",
  142. "/user2/repo1/releases/tag/v1.1",
  143. }, links)
  144. }
  145. func TestViewTagsList(t *testing.T) {
  146. defer prepareTestEnv(t)()
  147. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}).(*repo_model.Repository)
  148. link := repo.Link() + "/tags"
  149. session := loginUser(t, "user1")
  150. req := NewRequest(t, "GET", link)
  151. rsp := session.MakeRequest(t, req, http.StatusOK)
  152. htmlDoc := NewHTMLParser(t, rsp.Body)
  153. tags := htmlDoc.Find(".tag-list tr")
  154. assert.Equal(t, 3, tags.Length())
  155. tagNames := make([]string, 0, 5)
  156. tags.Each(func(i int, s *goquery.Selection) {
  157. tagNames = append(tagNames, s.Find(".tag a.df.ac").Text())
  158. })
  159. assert.EqualValues(t, []string{"v1.0", "delete-tag", "v1.1"}, tagNames)
  160. }