2017-04-25 10:24:51 +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.
2022-09-02 22:18:23 +03:00
package integration
2017-04-25 10:24:51 +03:00
import (
2017-07-15 17:21:51 +03:00
"fmt"
2017-04-25 10:24:51 +03:00
"net/http"
2020-02-01 22:11:32 +03:00
"path"
2018-05-01 10:04:36 +03:00
"strings"
2017-04-25 10:24:51 +03:00
"testing"
2020-02-01 22:11:32 +03:00
"time"
2017-07-15 17:21:51 +03:00
"code.gitea.io/gitea/modules/setting"
2022-09-02 22:18:23 +03:00
"code.gitea.io/gitea/tests"
2017-07-15 17:21:51 +03:00
2018-05-01 10:04:36 +03:00
"github.com/PuerkitoBio/goquery"
2017-07-15 17:21:51 +03:00
"github.com/stretchr/testify/assert"
2017-04-25 10:24:51 +03:00
)
func TestViewRepo ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2017-04-25 10:24:51 +03:00
2022-10-13 11:31:10 +03:00
session := loginUser ( t , "user2" )
2017-06-10 03:41:36 +03:00
req := NewRequest ( t , "GET" , "/user2/repo1" )
2022-10-13 11:31:10 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
noDescription := htmlDoc . doc . Find ( "#repo-desc" ) . Children ( )
repoTopics := htmlDoc . doc . Find ( "#repo-topics" ) . Children ( )
repoSummary := htmlDoc . doc . Find ( ".repository-summary" ) . Children ( )
assert . True ( t , noDescription . HasClass ( "no-description" ) )
assert . True ( t , repoTopics . HasClass ( "repo-topic" ) )
assert . True ( t , repoSummary . HasClass ( "repository-menu" ) )
2017-06-15 05:50:12 +03:00
req = NewRequest ( t , "GET" , "/user3/repo3" )
2017-07-07 22:36:47 +03:00
MakeRequest ( t , req , http . StatusNotFound )
2017-06-15 05:50:12 +03:00
2022-10-13 11:31:10 +03:00
session = loginUser ( t , "user1" )
2017-07-07 22:36:47 +03:00
session . MakeRequest ( t , req , http . StatusNotFound )
2017-06-15 05:50:12 +03:00
}
2020-02-01 22:11:32 +03:00
func testViewRepo ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2017-06-15 05:50:12 +03:00
req := NewRequest ( t , "GET" , "/user3/repo3" )
2017-06-17 07:49:45 +03:00
session := loginUser ( t , "user2" )
2020-02-01 22:11:32 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
files := htmlDoc . doc . Find ( "#repo-files-table > TBODY > TR" )
type file struct {
fileName string
commitID string
commitMsg string
commitTime string
}
var items [ ] file
files . Each ( func ( i int , s * goquery . Selection ) {
tds := s . Find ( "td" )
var f file
tds . Each ( func ( i int , s * goquery . Selection ) {
if i == 0 {
f . fileName = strings . TrimSpace ( s . Text ( ) )
} else if i == 1 {
a := s . Find ( "a" )
f . commitMsg = strings . TrimSpace ( a . Text ( ) )
l , _ := a . Attr ( "href" )
f . commitID = path . Base ( l )
}
} )
2022-08-13 00:03:41 +03:00
f . commitTime , _ = s . Find ( "span.time-since" ) . Attr ( "data-content" )
2020-02-01 22:11:32 +03:00
items = append ( items , f )
} )
2020-02-25 06:05:00 +03:00
commitT := time . Date ( 2017 , time . June , 14 , 13 , 54 , 21 , 0 , time . UTC ) . In ( time . Local ) . Format ( time . RFC1123 )
2020-02-01 22:11:32 +03:00
assert . EqualValues ( t , [ ] file {
{
fileName : "doc" ,
commitID : "2a47ca4b614a9f5a43abbd5ad851a54a616ffee6" ,
commitMsg : "init project" ,
2020-02-25 06:05:00 +03:00
commitTime : commitT ,
2020-02-01 22:11:32 +03:00
} ,
{
fileName : "README.md" ,
commitID : "2a47ca4b614a9f5a43abbd5ad851a54a616ffee6" ,
commitMsg : "init project" ,
2020-02-25 06:05:00 +03:00
commitTime : commitT ,
2020-02-01 22:11:32 +03:00
} ,
} , items )
}
func TestViewRepo2 ( t * testing . T ) {
// no last commit cache
testViewRepo ( t )
// enable last commit cache for all repositories
oldCommitsCount := setting . CacheService . LastCommit . CommitsCount
setting . CacheService . LastCommit . CommitsCount = 0
// first view will not hit the cache
testViewRepo ( t )
// second view will hit the cache
testViewRepo ( t )
setting . CacheService . LastCommit . CommitsCount = oldCommitsCount
2017-06-15 05:50:12 +03:00
}
func TestViewRepo3 ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2017-06-15 05:50:12 +03:00
req := NewRequest ( t , "GET" , "/user3/repo3" )
2017-07-17 05:04:43 +03:00
session := loginUser ( t , "user4" )
2017-07-07 22:36:47 +03:00
session . MakeRequest ( t , req , http . StatusOK )
2017-04-25 10:24:51 +03:00
}
2017-07-15 17:21:51 +03:00
func TestViewRepo1CloneLinkAnonymous ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2017-07-15 17:21:51 +03:00
req := NewRequest ( t , "GET" , "/user2/repo1" )
resp := MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
link , exists := htmlDoc . doc . Find ( "#repo-clone-https" ) . Attr ( "data-link" )
assert . True ( t , exists , "The template has changed" )
assert . Equal ( t , setting . AppURL + "user2/repo1.git" , link )
_ , exists = htmlDoc . doc . Find ( "#repo-clone-ssh" ) . Attr ( "data-link" )
assert . False ( t , exists )
}
func TestViewRepo1CloneLinkAuthorized ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2017-07-15 17:21:51 +03:00
session := loginUser ( t , "user2" )
req := NewRequest ( t , "GET" , "/user2/repo1" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
link , exists := htmlDoc . doc . Find ( "#repo-clone-https" ) . Attr ( "data-link" )
assert . True ( t , exists , "The template has changed" )
assert . Equal ( t , setting . AppURL + "user2/repo1.git" , link )
link , exists = htmlDoc . doc . Find ( "#repo-clone-ssh" ) . Attr ( "data-link" )
assert . True ( t , exists , "The template has changed" )
2022-02-08 00:56:45 +03:00
sshURL := fmt . Sprintf ( "ssh://%s@%s:%d/user2/repo1.git" , setting . SSH . User , setting . SSH . Domain , setting . SSH . Port )
2017-07-15 17:21:51 +03:00
assert . Equal ( t , sshURL , link )
}
2018-05-01 10:04:36 +03:00
func TestViewRepoWithSymlinks ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2018-05-01 10:04:36 +03:00
session := loginUser ( t , "user2" )
req := NewRequest ( t , "GET" , "/user2/repo20.git" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
2020-08-26 18:52:44 +03:00
files := htmlDoc . doc . Find ( "#repo-files-table > TBODY > TR > TD.name > SPAN.truncate" )
2018-05-01 10:04:36 +03:00
items := files . Map ( func ( i int , s * goquery . Selection ) string {
2020-02-11 20:02:41 +03:00
cls , _ := s . Find ( "SVG" ) . Attr ( "class" )
2018-05-01 10:04:36 +03:00
file := strings . Trim ( s . Find ( "A" ) . Text ( ) , " \t\n" )
return fmt . Sprintf ( "%s: %s" , file , cls )
} )
2021-06-07 08:27:09 +03:00
assert . Len ( t , items , 5 )
2022-04-01 03:15:46 +03:00
assert . Equal ( t , "a: svg octicon-file-directory-fill" , items [ 0 ] )
2021-06-07 08:27:09 +03:00
assert . Equal ( t , "link_b: svg octicon-file-submodule" , items [ 1 ] )
assert . Equal ( t , "link_d: svg octicon-file-symlink-file" , items [ 2 ] )
assert . Equal ( t , "link_hi: svg octicon-file-symlink-file" , items [ 3 ] )
assert . Equal ( t , "link_link: svg octicon-file-symlink-file" , items [ 4 ] )
2018-05-01 10:04:36 +03:00
}
2019-01-28 00:13:15 +03:00
// TestViewAsRepoAdmin tests PR #2167
func TestViewAsRepoAdmin ( t * testing . T ) {
for user , expectedNoDescription := range map [ string ] bool {
"user2" : true ,
2019-02-19 10:19:28 +03:00
"user4" : false ,
2019-01-28 00:13:15 +03:00
} {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2019-01-28 00:13:15 +03:00
session := loginUser ( t , user )
req := NewRequest ( t , "GET" , "/user2/repo1.git" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
noDescription := htmlDoc . doc . Find ( "#repo-desc" ) . Children ( )
2022-10-13 11:31:10 +03:00
repoTopics := htmlDoc . doc . Find ( "#repo-topics" ) . Children ( )
repoSummary := htmlDoc . doc . Find ( ".repository-summary" ) . Children ( )
2019-01-28 00:13:15 +03:00
assert . Equal ( t , expectedNoDescription , noDescription . HasClass ( "no-description" ) )
2022-10-13 11:31:10 +03:00
assert . True ( t , repoTopics . HasClass ( "repo-topic" ) )
assert . True ( t , repoSummary . HasClass ( "repository-menu" ) )
2019-01-28 00:13:15 +03:00
}
}
2022-10-13 11:31:10 +03:00
// TestViewFileInRepo repo description, topics and summary should not be displayed when viewing a file
func TestViewFileInRepo ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
session := loginUser ( t , "user2" )
req := NewRequest ( t , "GET" , "/user2/repo1/src/branch/master/README.md" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
description := htmlDoc . doc . Find ( "#repo-desc" )
repoTopics := htmlDoc . doc . Find ( "#repo-topics" )
repoSummary := htmlDoc . doc . Find ( ".repository-summary" )
assert . EqualValues ( t , 0 , description . Length ( ) )
assert . EqualValues ( t , 0 , repoTopics . Length ( ) )
assert . EqualValues ( t , 0 , repoSummary . Length ( ) )
}
// TestBlameFileInRepo repo description, topics and summary should not be displayed when running blame on a file
func TestBlameFileInRepo ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
session := loginUser ( t , "user2" )
req := NewRequest ( t , "GET" , "/user2/repo1/blame/branch/master/README.md" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
description := htmlDoc . doc . Find ( "#repo-desc" )
repoTopics := htmlDoc . doc . Find ( "#repo-topics" )
repoSummary := htmlDoc . doc . Find ( ".repository-summary" )
assert . EqualValues ( t , 0 , description . Length ( ) )
assert . EqualValues ( t , 0 , repoTopics . Length ( ) )
assert . EqualValues ( t , 0 , repoSummary . Length ( ) )
}
// TestViewRepoDirectory repo description, topics and summary should not be displayed when within a directory
func TestViewRepoDirectory ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
session := loginUser ( t , "user2" )
req := NewRequest ( t , "GET" , "/user2/repo20/src/branch/master/a" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
description := htmlDoc . doc . Find ( "#repo-desc" )
repoTopics := htmlDoc . doc . Find ( "#repo-topics" )
repoSummary := htmlDoc . doc . Find ( ".repository-summary" )
repoFilesTable := htmlDoc . doc . Find ( "#repo-files-table" )
assert . NotZero ( t , len ( repoFilesTable . Nodes ) )
assert . Zero ( t , description . Length ( ) )
assert . Zero ( t , repoTopics . Length ( ) )
assert . Zero ( t , repoSummary . Length ( ) )
}