2017-06-03 06:46:56 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package integrations
import (
2017-06-29 18:11:38 +03:00
"fmt"
2017-06-03 06:46:56 +03:00
"net/http"
"testing"
2020-04-08 00:52:01 +03:00
"time"
2017-06-03 06:46:56 +03:00
2021-05-06 06:12:50 +03:00
"code.gitea.io/gitea/models"
2020-06-09 05:46:51 +03:00
"code.gitea.io/gitea/modules/setting"
2017-12-16 00:11:02 +03:00
"code.gitea.io/gitea/modules/test"
2021-05-06 06:12:50 +03:00
"github.com/PuerkitoBio/goquery"
2017-06-03 06:46:56 +03:00
"github.com/stretchr/testify/assert"
2019-08-23 19:40:30 +03:00
"github.com/unknwon/i18n"
2017-06-03 06:46:56 +03:00
)
2017-06-29 18:11:38 +03:00
func createNewRelease ( t * testing . T , session * TestSession , repoURL , tag , title string , preRelease , draft bool ) {
req := NewRequest ( t , "GET" , repoURL + "/releases/new" )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-29 18:11:38 +03:00
htmlDoc := NewHTMLParser ( t , resp . Body )
2020-02-25 23:28:47 +03:00
link , exists := htmlDoc . doc . Find ( "form.ui.form" ) . Attr ( "action" )
2017-06-29 18:11:38 +03:00
assert . True ( t , exists , "The template has changed" )
postData := map [ string ] string {
"_csrf" : htmlDoc . GetCSRF ( ) ,
"tag_name" : tag ,
"tag_target" : "master" ,
"title" : title ,
"content" : "" ,
}
if preRelease {
postData [ "prerelease" ] = "on"
}
if draft {
postData [ "draft" ] = "Save Draft"
}
req = NewRequestWithValues ( t , "POST" , link , postData )
2017-07-07 22:36:47 +03:00
resp = session . MakeRequest ( t , req , http . StatusFound )
2017-06-29 18:11:38 +03:00
2017-12-16 00:11:02 +03:00
test . RedirectURL ( resp ) // check that redirect URL exists
2017-06-29 18:11:38 +03:00
}
func checkLatestReleaseAndCount ( t * testing . T , session * TestSession , repoURL , version , label string , count int ) {
req := NewRequest ( t , "GET" , repoURL + "/releases" )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-29 18:11:38 +03:00
htmlDoc := NewHTMLParser ( t , resp . Body )
labelText := htmlDoc . doc . Find ( "#release-list > li .meta .label" ) . First ( ) . Text ( )
assert . EqualValues ( t , label , labelText )
2020-11-03 02:10:22 +03:00
titleText := htmlDoc . doc . Find ( "#release-list > li .detail h4 a" ) . First ( ) . Text ( )
2017-06-29 18:11:38 +03:00
assert . EqualValues ( t , version , titleText )
releaseList := htmlDoc . doc . Find ( "#release-list > li" )
assert . EqualValues ( t , count , releaseList . Length ( ) )
}
2017-06-03 06:46:56 +03:00
func TestViewReleases ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-06-03 06:46:56 +03:00
2017-06-17 07:49:45 +03:00
session := loginUser ( t , "user2" )
2017-06-10 03:41:36 +03:00
req := NewRequest ( t , "GET" , "/user2/repo1/releases" )
2017-07-07 22:36:47 +03:00
session . MakeRequest ( t , req , http . StatusOK )
2020-04-08 00:52:01 +03:00
// if CI is to slow this test fail, so lets wait a bit
time . Sleep ( time . Millisecond * 100 )
2017-06-03 06:46:56 +03:00
}
2017-06-18 06:38:24 +03:00
func TestViewReleasesNoLogin ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-06-18 06:38:24 +03:00
req := NewRequest ( t , "GET" , "/user2/repo1/releases" )
2017-07-07 22:36:47 +03:00
MakeRequest ( t , req , http . StatusOK )
2017-06-18 06:38:24 +03:00
}
2017-06-29 18:11:38 +03:00
func TestCreateRelease ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-06-29 18:11:38 +03:00
session := loginUser ( t , "user2" )
createNewRelease ( t , session , "/user2/repo1" , "v0.0.1" , "v0.0.1" , false , false )
2021-05-06 06:12:50 +03:00
checkLatestReleaseAndCount ( t , session , "/user2/repo1" , "v0.0.1" , i18n . Tr ( "en" , "repo.release.stable" ) , 3 )
2017-06-29 18:11:38 +03:00
}
func TestCreateReleasePreRelease ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-06-29 18:11:38 +03:00
session := loginUser ( t , "user2" )
createNewRelease ( t , session , "/user2/repo1" , "v0.0.1" , "v0.0.1" , true , false )
2021-05-06 06:12:50 +03:00
checkLatestReleaseAndCount ( t , session , "/user2/repo1" , "v0.0.1" , i18n . Tr ( "en" , "repo.release.prerelease" ) , 3 )
2017-06-29 18:11:38 +03:00
}
func TestCreateReleaseDraft ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-06-29 18:11:38 +03:00
session := loginUser ( t , "user2" )
createNewRelease ( t , session , "/user2/repo1" , "v0.0.1" , "v0.0.1" , false , true )
2021-05-06 06:12:50 +03:00
checkLatestReleaseAndCount ( t , session , "/user2/repo1" , "v0.0.1" , i18n . Tr ( "en" , "repo.release.draft" ) , 3 )
2017-06-29 18:11:38 +03:00
}
func TestCreateReleasePaging ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-06-29 18:11:38 +03:00
2020-06-09 05:46:51 +03:00
oldAPIDefaultNum := setting . API . DefaultPagingNum
defer func ( ) {
setting . API . DefaultPagingNum = oldAPIDefaultNum
} ( )
setting . API . DefaultPagingNum = 10
2017-06-29 18:11:38 +03:00
session := loginUser ( t , "user2" )
// Create enaugh releases to have paging
for i := 0 ; i < 12 ; i ++ {
version := fmt . Sprintf ( "v0.0.%d" , i )
createNewRelease ( t , session , "/user2/repo1" , version , version , false , false )
}
createNewRelease ( t , session , "/user2/repo1" , "v0.0.12" , "v0.0.12" , false , true )
checkLatestReleaseAndCount ( t , session , "/user2/repo1" , "v0.0.12" , i18n . Tr ( "en" , "repo.release.draft" ) , 10 )
2019-02-19 10:19:28 +03:00
// Check that user4 does not see draft and still see 10 latest releases
session2 := loginUser ( t , "user4" )
2017-06-29 18:11:38 +03:00
checkLatestReleaseAndCount ( t , session2 , "/user2/repo1" , "v0.0.11" , i18n . Tr ( "en" , "repo.release.stable" ) , 10 )
}
2021-05-06 06:12:50 +03:00
func TestViewReleaseListNoLogin ( t * testing . T ) {
defer prepareTestEnv ( t ) ( )
repo := models . AssertExistsAndLoadBean ( t , & models . Repository { ID : 1 } ) . ( * models . Repository )
link := repo . Link ( ) + "/releases"
req := NewRequest ( t , "GET" , link )
rsp := MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , rsp . Body )
releases := htmlDoc . Find ( "#release-list li.ui.grid" )
assert . Equal ( t , 1 , releases . Length ( ) )
links := make ( [ ] string , 0 , 5 )
releases . Each ( func ( i int , s * goquery . Selection ) {
link , exist := s . Find ( ".release-list-title a" ) . Attr ( "href" )
if ! exist {
return
}
links = append ( links , link )
} )
assert . EqualValues ( t , [ ] string { "/user2/repo1/releases/tag/v1.1" } , links )
}
func TestViewReleaseListLogin ( t * testing . T ) {
defer prepareTestEnv ( t ) ( )
repo := models . AssertExistsAndLoadBean ( t , & models . Repository { ID : 1 } ) . ( * models . Repository )
link := repo . Link ( ) + "/releases"
session := loginUser ( t , "user1" )
req := NewRequest ( t , "GET" , link )
rsp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , rsp . Body )
releases := htmlDoc . Find ( "#release-list li.ui.grid" )
assert . Equal ( t , 2 , releases . Length ( ) )
links := make ( [ ] string , 0 , 5 )
releases . Each ( func ( i int , s * goquery . Selection ) {
link , exist := s . Find ( ".release-list-title a" ) . Attr ( "href" )
if ! exist {
return
}
links = append ( links , link )
} )
assert . EqualValues ( t , [ ] string { "/user2/repo1/releases/tag/draft-release" ,
"/user2/repo1/releases/tag/v1.1" } , links )
}
func TestViewTagsList ( t * testing . T ) {
defer prepareTestEnv ( t ) ( )
repo := models . AssertExistsAndLoadBean ( t , & models . Repository { ID : 1 } ) . ( * models . Repository )
link := repo . Link ( ) + "/tags"
session := loginUser ( t , "user1" )
req := NewRequest ( t , "GET" , link )
rsp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , rsp . Body )
tags := htmlDoc . Find ( ".tag-list tr" )
assert . Equal ( t , 2 , tags . Length ( ) )
tagNames := make ( [ ] string , 0 , 5 )
tags . Each ( func ( i int , s * goquery . Selection ) {
tagNames = append ( tagNames , s . Find ( ".tag a.df.ac" ) . Text ( ) )
} )
assert . EqualValues ( t , [ ] string { "delete-tag" , "v1.1" } , tagNames )
}