2017-06-02 23:46:56 -04:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2024-05-29 22:46:36 +05:00
// Copyright 2024 The Forgejo Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2017-06-02 23:46:56 -04:00
2022-09-02 15:18:23 -04:00
package integration
2017-06-02 23:46:56 -04:00
import (
2017-06-29 18:11:38 +03:00
"fmt"
2017-06-02 23:46:56 -04:00
"net/http"
2024-05-29 22:46:36 +05:00
"strconv"
2017-06-02 23:46:56 -04:00
"testing"
2020-04-07 23:52:01 +02:00
"time"
2017-06-02 23:46:56 -04:00
2024-04-24 15:15:55 +00:00
auth_model "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
2021-12-10 09:27:50 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-16 16:53:21 +08:00
"code.gitea.io/gitea/models/unittest"
2020-06-09 04:46:51 +02:00
"code.gitea.io/gitea/modules/setting"
2024-04-24 15:15:55 +00:00
api "code.gitea.io/gitea/modules/structs"
2017-12-15 13:11:02 -08:00
"code.gitea.io/gitea/modules/test"
2022-06-26 16:19:22 +02:00
"code.gitea.io/gitea/modules/translation"
2022-09-02 15:18:23 -04:00
"code.gitea.io/gitea/tests"
2017-12-15 13:11:02 -08:00
2021-05-06 11:12:50 +08:00
"github.com/PuerkitoBio/goquery"
2017-06-02 23:46:56 -04:00
"github.com/stretchr/testify/assert"
2024-04-24 15:15:55 +00:00
"github.com/stretchr/testify/require"
2017-06-02 23:46:56 -04:00
)
2017-06-29 18:11:38 +03:00
func createNewRelease ( t * testing . T , session * TestSession , repoURL , tag , title string , preRelease , draft bool ) {
2023-08-05 14:47:09 +02:00
createNewReleaseTarget ( t , session , repoURL , tag , title , "master" , preRelease , draft )
}
func createNewReleaseTarget ( t * testing . T , session * TestSession , repoURL , tag , title , target string , preRelease , draft bool ) {
2017-06-29 18:11:38 +03:00
req := NewRequest ( t , "GET" , repoURL + "/releases/new" )
2017-07-07 15:36:47 -04:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-29 18:11:38 +03:00
htmlDoc := NewHTMLParser ( t , resp . Body )
2020-02-25 14:28:47 -06: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 ,
2023-08-05 14:47:09 +02:00
"tag_target" : target ,
2017-06-29 18:11:38 +03:00
"title" : title ,
"content" : "" ,
}
if preRelease {
postData [ "prerelease" ] = "on"
}
if draft {
postData [ "draft" ] = "Save Draft"
}
req = NewRequestWithValues ( t , "POST" , link , postData )
2022-03-23 05:54:07 +01:00
resp = session . MakeRequest ( t , req , http . StatusSeeOther )
2017-06-29 18:11:38 +03:00
2017-12-15 13:11:02 -08: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 15:36:47 -04:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-29 18:11:38 +03:00
htmlDoc := NewHTMLParser ( t , resp . Body )
2022-12-06 14:15:46 +01:00
labelText := htmlDoc . doc . Find ( "#release-list > li .detail .label" ) . First ( ) . Text ( )
2017-06-29 18:11:38 +03:00
assert . EqualValues ( t , label , labelText )
2020-11-03 07:10:22 +08: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 )
2024-05-29 22:46:36 +05:00
// Check release count in the counter on the Release/Tag switch, as well as that the tab is highlighted
if count < 10 { // Only check values less than 10, should be enough attempts before this test cracks
// 10 is the pagination limit, but the counter can have more than that
releaseTab := htmlDoc . doc . Find ( ".repository.releases .ui.compact.menu a.active.item[href$='/releases']" )
assert . Contains ( t , releaseTab . Text ( ) , strconv . Itoa ( count ) + " release" ) // Could be "1 release" or "4 releases"
}
2017-06-29 18:11:38 +03:00
releaseList := htmlDoc . doc . Find ( "#release-list > li" )
assert . EqualValues ( t , count , releaseList . Length ( ) )
}
2017-06-02 23:46:56 -04:00
func TestViewReleases ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrepareTestEnv ( t ) ( )
2017-06-02 23:46:56 -04:00
2017-06-17 00:49:45 -04:00
session := loginUser ( t , "user2" )
2017-06-09 20:41:36 -04:00
req := NewRequest ( t , "GET" , "/user2/repo1/releases" )
2017-07-07 15:36:47 -04:00
session . MakeRequest ( t , req , http . StatusOK )
2020-04-07 23:52:01 +02:00
2024-05-29 22:46:36 +05:00
// if CI is too slow this test fail, so lets wait a bit
2020-04-07 23:52:01 +02:00
time . Sleep ( time . Millisecond * 100 )
2017-06-02 23:46:56 -04:00
}
2017-06-17 23:38:24 -04:00
func TestViewReleasesNoLogin ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrepareTestEnv ( t ) ( )
2017-06-17 23:38:24 -04:00
req := NewRequest ( t , "GET" , "/user2/repo1/releases" )
2017-07-07 15:36:47 -04:00
MakeRequest ( t , req , http . StatusOK )
2017-06-17 23:38:24 -04:00
}
2017-06-29 18:11:38 +03:00
func TestCreateRelease ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . 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 )
2024-02-15 05:48:45 +08:00
checkLatestReleaseAndCount ( t , session , "/user2/repo1" , "v0.0.1" , translation . NewLocale ( "en-US" ) . TrString ( "repo.release.stable" ) , 4 )
2017-06-29 18:11:38 +03:00
}
2023-11-12 20:01:24 +01:00
func TestDeleteRelease ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 57 , OwnerName : "user2" , LowerName : "repo-release" } )
release := unittest . AssertExistsAndLoadBean ( t , & repo_model . Release { TagName : "v2.0" } )
assert . False ( t , release . IsTag )
// Using the ID of a comment that does not belong to the repository must fail
session5 := loginUser ( t , "user5" )
otherRepo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { OwnerName : "user5" , LowerName : "repo4" } )
req := NewRequestWithValues ( t , "POST" , fmt . Sprintf ( "%s/releases/delete?id=%d" , otherRepo . Link ( ) , release . ID ) , map [ string ] string {
"_csrf" : GetCSRF ( t , session5 , otherRepo . Link ( ) ) ,
} )
session5 . MakeRequest ( t , req , http . StatusNotFound )
session := loginUser ( t , "user2" )
req = NewRequestWithValues ( t , "POST" , fmt . Sprintf ( "%s/releases/delete?id=%d" , repo . Link ( ) , release . ID ) , map [ string ] string {
"_csrf" : GetCSRF ( t , session , repo . Link ( ) ) ,
} )
session . MakeRequest ( t , req , http . StatusOK )
release = unittest . AssertExistsAndLoadBean ( t , & repo_model . Release { ID : release . ID } )
if assert . True ( t , release . IsTag ) {
req = NewRequestWithValues ( t , "POST" , fmt . Sprintf ( "%s/tags/delete?id=%d" , otherRepo . Link ( ) , release . ID ) , map [ string ] string {
"_csrf" : GetCSRF ( t , session5 , otherRepo . Link ( ) ) ,
} )
session5 . MakeRequest ( t , req , http . StatusNotFound )
req = NewRequestWithValues ( t , "POST" , fmt . Sprintf ( "%s/tags/delete?id=%d" , repo . Link ( ) , release . ID ) , map [ string ] string {
"_csrf" : GetCSRF ( t , session , repo . Link ( ) ) ,
} )
session . MakeRequest ( t , req , http . StatusOK )
unittest . AssertNotExistsBean ( t , & repo_model . Release { ID : release . ID } )
}
}
2017-06-29 18:11:38 +03:00
func TestCreateReleasePreRelease ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . 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 )
2024-02-15 05:48:45 +08:00
checkLatestReleaseAndCount ( t , session , "/user2/repo1" , "v0.0.1" , translation . NewLocale ( "en-US" ) . TrString ( "repo.release.prerelease" ) , 4 )
2017-06-29 18:11:38 +03:00
}
func TestCreateReleaseDraft ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . 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 )
2024-02-15 05:48:45 +08:00
checkLatestReleaseAndCount ( t , session , "/user2/repo1" , "v0.0.1" , translation . NewLocale ( "en-US" ) . TrString ( "repo.release.draft" ) , 4 )
2017-06-29 18:11:38 +03:00
}
func TestCreateReleasePaging ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrepareTestEnv ( t ) ( )
2017-06-29 18:11:38 +03:00
2020-06-09 04:46:51 +02: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" )
2021-07-08 07:38:13 -04:00
// Create enough releases to have paging
2017-06-29 18:11:38 +03:00
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 )
2024-02-15 05:48:45 +08:00
checkLatestReleaseAndCount ( t , session , "/user2/repo1" , "v0.0.12" , translation . NewLocale ( "en-US" ) . TrString ( "repo.release.draft" ) , 10 )
2017-06-29 18:11:38 +03:00
2019-02-19 15:19:28 +08:00
// Check that user4 does not see draft and still see 10 latest releases
session2 := loginUser ( t , "user4" )
2024-02-15 05:48:45 +08:00
checkLatestReleaseAndCount ( t , session2 , "/user2/repo1" , "v0.0.11" , translation . NewLocale ( "en-US" ) . TrString ( "repo.release.stable" ) , 10 )
2017-06-29 18:11:38 +03:00
}
2021-05-06 11:12:50 +08:00
func TestViewReleaseListNoLogin ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrepareTestEnv ( t ) ( )
2021-05-06 11:12:50 +08:00
2023-04-18 21:11:17 +02:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 57 , OwnerName : "user2" , LowerName : "repo-release" } )
2021-05-06 11:12:50 +08:00
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" )
2023-05-10 05:43:55 +02:00
assert . Equal ( t , 5 , releases . Length ( ) )
2021-05-06 11:12:50 +08:00
2023-05-10 05:43:55 +02:00
links := make ( [ ] string , 0 , 5 )
commitsToMain := make ( [ ] string , 0 , 5 )
2021-05-06 11:12:50 +08:00
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 )
2023-04-18 21:11:17 +02:00
commitsToMain = append ( commitsToMain , s . Find ( ".ahead > a" ) . Text ( ) )
2021-05-06 11:12:50 +08:00
} )
2023-04-18 21:11:17 +02:00
assert . EqualValues ( t , [ ] string {
2023-05-10 05:43:55 +02:00
"/user2/repo-release/releases/tag/empty-target-branch" ,
"/user2/repo-release/releases/tag/non-existing-target-branch" ,
2023-04-18 21:11:17 +02:00
"/user2/repo-release/releases/tag/v2.0" ,
"/user2/repo-release/releases/tag/v1.1" ,
"/user2/repo-release/releases/tag/v1.0" ,
} , links )
assert . EqualValues ( t , [ ] string {
2023-05-10 05:43:55 +02:00
"1 commits" , // like v1.1
"1 commits" , // like v1.1
2023-04-18 21:11:17 +02:00
"0 commits" ,
"1 commits" , // should be 3 commits ahead and 2 commits behind, but not implemented yet
"3 commits" ,
} , commitsToMain )
}
func TestViewSingleReleaseNoLogin ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
req := NewRequest ( t , "GET" , "/user2/repo-release/releases/tag/v1.0" )
resp := MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
// check the "number of commits to main since this release"
releaseList := htmlDoc . doc . Find ( "#release-list .ahead > a" )
assert . EqualValues ( t , 1 , releaseList . Length ( ) )
assert . EqualValues ( t , "3 commits" , releaseList . First ( ) . Text ( ) )
2021-05-06 11:12:50 +08:00
}
func TestViewReleaseListLogin ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrepareTestEnv ( t ) ( )
2021-05-06 11:12:50 +08:00
2022-08-16 10:22:25 +08:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2021-05-06 11:12:50 +08:00
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" )
2021-06-17 10:58:10 +02:00
assert . Equal ( t , 3 , releases . Length ( ) )
2021-05-06 11:12:50 +08:00
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 )
} )
2021-06-17 10:58:10 +02:00
assert . EqualValues ( t , [ ] string {
"/user2/repo1/releases/tag/draft-release" ,
"/user2/repo1/releases/tag/v1.0" ,
"/user2/repo1/releases/tag/v1.1" ,
} , links )
2021-05-06 11:12:50 +08:00
}
2024-11-02 10:24:35 +01:00
func TestViewReleaseListKeyword ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
link := repo . Link ( ) + "/releases?q=testing"
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 , 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 )
}
2023-08-05 14:47:09 +02:00
func TestReleaseOnCommit ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
session := loginUser ( t , "user2" )
createNewReleaseTarget ( t , session , "/user2/repo1" , "v0.0.1" , "v0.0.1" , "65f1bf27bc3bf70f64657658635e66094edbcb4d" , false , false )
2024-02-15 05:48:45 +08:00
checkLatestReleaseAndCount ( t , session , "/user2/repo1" , "v0.0.1" , translation . NewLocale ( "en-US" ) . TrString ( "repo.release.stable" ) , 4 )
2023-08-05 14:47:09 +02:00
}
2021-05-06 11:12:50 +08:00
func TestViewTagsList ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrepareTestEnv ( t ) ( )
2021-05-06 11:12:50 +08:00
2022-08-16 10:22:25 +08:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
2021-05-06 11:12:50 +08:00
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" )
2021-06-17 10:58:10 +02:00
assert . Equal ( t , 3 , tags . Length ( ) )
2021-05-06 11:12:50 +08:00
tagNames := make ( [ ] string , 0 , 5 )
tags . Each ( func ( i int , s * goquery . Selection ) {
2024-03-22 20:51:29 +01:00
tagNames = append ( tagNames , s . Find ( ".tag a.tw-flex.tw-items-center" ) . Text ( ) )
2021-05-06 11:12:50 +08:00
} )
2021-06-17 10:58:10 +02:00
assert . EqualValues ( t , [ ] string { "v1.0" , "delete-tag" , "v1.1" } , tagNames )
2021-05-06 11:12:50 +08:00
}
2023-10-01 18:41:52 +08:00
func TestDownloadReleaseAttachment ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
tests . PrepareAttachmentsStorage ( t )
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 2 } )
url := repo . Link ( ) + "/releases/download/v1.1/README.md"
req := NewRequest ( t , "GET" , url )
MakeRequest ( t , req , http . StatusNotFound )
req = NewRequest ( t , "GET" , url )
session := loginUser ( t , "user2" )
session . MakeRequest ( t , req , http . StatusOK )
}
2024-04-24 15:15:55 +00:00
func TestReleaseHideArchiveLinksUI ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
release := unittest . AssertExistsAndLoadBean ( t , & repo_model . Release { TagName : "v2.0" } )
require . NoError ( t , release . LoadAttributes ( db . DefaultContext ) )
session := loginUser ( t , release . Repo . OwnerName )
token := getTokenForLoggedInUser ( t , session , auth_model . AccessTokenScopeWriteRepository )
zipURL := fmt . Sprintf ( "%s/archive/%s.zip" , release . Repo . Link ( ) , release . TagName )
tarGzURL := fmt . Sprintf ( "%s/archive/%s.tar.gz" , release . Repo . Link ( ) , release . TagName )
resp := session . MakeRequest ( t , NewRequest ( t , "GET" , release . HTMLURL ( ) ) , http . StatusOK )
body := resp . Body . String ( )
assert . Contains ( t , body , zipURL )
assert . Contains ( t , body , tarGzURL )
hideArchiveLinks := true
req := NewRequestWithJSON ( t , "PATCH" , release . APIURL ( ) , & api . EditReleaseOption {
HideArchiveLinks : & hideArchiveLinks ,
} ) . AddTokenAuth ( token )
MakeRequest ( t , req , http . StatusOK )
resp = session . MakeRequest ( t , NewRequest ( t , "GET" , release . HTMLURL ( ) ) , http . StatusOK )
body = resp . Body . String ( )
assert . NotContains ( t , body , zipURL )
assert . NotContains ( t , body , tarGzURL )
}