2017-04-25 09:24:51 +02:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 19:20:29 +01:00
// SPDX-License-Identifier: MIT
2017-04-25 09:24:51 +02:00
2022-09-02 21:18:23 +02:00
package integration
2017-04-25 09:24:51 +02:00
import (
2017-07-15 16:21:51 +02:00
"fmt"
2017-04-25 09:24:51 +02:00
"net/http"
2023-09-13 00:53:03 +02:00
"net/http/httptest"
2020-02-01 20:11:32 +01:00
"path"
2018-05-01 09:04:36 +02:00
"strings"
2017-04-25 09:24:51 +02:00
"testing"
2020-02-01 20:11:32 +01:00
"time"
2017-07-15 16:21:51 +02:00
2023-09-13 00:53:03 +02:00
gitea_context "code.gitea.io/gitea/modules/context"
2017-07-15 16:21:51 +02:00
"code.gitea.io/gitea/modules/setting"
2023-09-13 00:53:03 +02:00
"code.gitea.io/gitea/modules/translation"
2022-09-02 21:18:23 +02:00
"code.gitea.io/gitea/tests"
2017-07-15 16:21:51 +02:00
2018-05-01 09:04:36 +02:00
"github.com/PuerkitoBio/goquery"
2017-07-15 16:21:51 +02:00
"github.com/stretchr/testify/assert"
2017-04-25 09:24:51 +02:00
)
func TestViewRepo ( t * testing . T ) {
2022-09-02 21:18:23 +02:00
defer tests . PrepareTestEnv ( t ) ( )
2017-04-25 09:24:51 +02:00
2022-10-13 10:31:10 +02:00
session := loginUser ( t , "user2" )
2017-06-10 02:41:36 +02:00
req := NewRequest ( t , "GET" , "/user2/repo1" )
2022-10-13 10:31:10 +02: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 04:50:12 +02:00
2023-09-14 04:59:53 +02:00
req = NewRequest ( t , "GET" , "/org3/repo3" )
2017-07-07 21:36:47 +02:00
MakeRequest ( t , req , http . StatusNotFound )
2017-06-15 04:50:12 +02:00
2022-10-13 10:31:10 +02:00
session = loginUser ( t , "user1" )
2017-07-07 21:36:47 +02:00
session . MakeRequest ( t , req , http . StatusNotFound )
2017-06-15 04:50:12 +02:00
}
2020-02-01 20:11:32 +01:00
func testViewRepo ( t * testing . T ) {
2022-09-02 21:18:23 +02:00
defer tests . PrepareTestEnv ( t ) ( )
2017-06-15 04:50:12 +02:00
2023-09-14 04:59:53 +02:00
req := NewRequest ( t , "GET" , "/org3/repo3" )
2017-06-17 06:49:45 +02:00
session := loginUser ( t , "user2" )
2020-02-01 20:11:32 +01: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 )
}
} )
2023-04-11 01:01:20 +02:00
// convert "2017-06-14 21:54:21 +0800" to "Wed, 14 Jun 2017 13:54:21 UTC"
htmlTimeString , _ := s . Find ( "relative-time.time-since" ) . Attr ( "datetime" )
htmlTime , _ := time . Parse ( time . RFC3339 , htmlTimeString )
In TestViewRepo2, convert computed timezones to local time (#24579)
This fixes up https://github.com/go-gitea/gitea/pull/10446; in that, the
*expected* timezone was changed to the local timezone, but the computed
timezone was left in UTC.
The result was this failure, when run on a non-UTC system:
```
Diff:
--- Expected
+++ Actual
@@ -5,3 +5,3 @@
commitMsg: (string) (len=12) "init project",
- commitTime: (string) (len=29) "Wed, 14 Jun 2017 09:54:21 EDT"
+ commitTime: (string) (len=29) "Wed, 14 Jun 2017 13:54:21 UTC"
},
@@ -11,3 +11,3 @@
commitMsg: (string) (len=12) "init project",
- commitTime: (string) (len=29) "Wed, 14 Jun 2017 09:54:21 EDT"
+ commitTime: (string) (len=29) "Wed, 14 Jun 2017 13:54:21 UTC"
}
Test: TestViewRepo2
```
I assume this was probably missed since the CI servers all run in UTC?
The Format() string "Mon, 02 Jan 2006 15:04:05 UTC" was incorrect: 'UTC'
isn't recognized as a variable placeholder, but was just being copied
verbatim. It should use 'MST' in order to command Format() to output the
attached timezone, which is what `time.RFC1123` has.
2023-05-08 15:07:41 +02:00
f . commitTime = htmlTime . In ( time . Local ) . Format ( time . RFC1123 )
2020-02-01 20:11:32 +01:00
items = append ( items , f )
} )
2020-02-25 04:05:00 +01:00
commitT := time . Date ( 2017 , time . June , 14 , 13 , 54 , 21 , 0 , time . UTC ) . In ( time . Local ) . Format ( time . RFC1123 )
2020-02-01 20:11:32 +01:00
assert . EqualValues ( t , [ ] file {
{
fileName : "doc" ,
commitID : "2a47ca4b614a9f5a43abbd5ad851a54a616ffee6" ,
commitMsg : "init project" ,
2020-02-25 04:05:00 +01:00
commitTime : commitT ,
2020-02-01 20:11:32 +01:00
} ,
{
fileName : "README.md" ,
commitID : "2a47ca4b614a9f5a43abbd5ad851a54a616ffee6" ,
commitMsg : "init project" ,
2020-02-25 04:05:00 +01:00
commitTime : commitT ,
2020-02-01 20:11:32 +01: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 04:50:12 +02:00
}
func TestViewRepo3 ( t * testing . T ) {
2022-09-02 21:18:23 +02:00
defer tests . PrepareTestEnv ( t ) ( )
2017-06-15 04:50:12 +02:00
2023-09-14 04:59:53 +02:00
req := NewRequest ( t , "GET" , "/org3/repo3" )
2017-07-17 04:04:43 +02:00
session := loginUser ( t , "user4" )
2017-07-07 21:36:47 +02:00
session . MakeRequest ( t , req , http . StatusOK )
2017-04-25 09:24:51 +02:00
}
2017-07-15 16:21:51 +02:00
func TestViewRepo1CloneLinkAnonymous ( t * testing . T ) {
2022-09-02 21:18:23 +02:00
defer tests . PrepareTestEnv ( t ) ( )
2017-07-15 16:21:51 +02: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 21:18:23 +02:00
defer tests . PrepareTestEnv ( t ) ( )
2017-07-15 16:21:51 +02: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-07 22:56:45 +01:00
sshURL := fmt . Sprintf ( "ssh://%s@%s:%d/user2/repo1.git" , setting . SSH . User , setting . SSH . Domain , setting . SSH . Port )
2017-07-15 16:21:51 +02:00
assert . Equal ( t , sshURL , link )
}
2018-05-01 09:04:36 +02:00
func TestViewRepoWithSymlinks ( t * testing . T ) {
2022-09-02 21:18:23 +02:00
defer tests . PrepareTestEnv ( t ) ( )
2018-05-01 09:04:36 +02: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 17:52:44 +02:00
files := htmlDoc . doc . Find ( "#repo-files-table > TBODY > TR > TD.name > SPAN.truncate" )
2018-05-01 09:04:36 +02:00
items := files . Map ( func ( i int , s * goquery . Selection ) string {
2020-02-11 18:02:41 +01:00
cls , _ := s . Find ( "SVG" ) . Attr ( "class" )
2018-05-01 09:04:36 +02:00
file := strings . Trim ( s . Find ( "A" ) . Text ( ) , " \t\n" )
return fmt . Sprintf ( "%s: %s" , file , cls )
} )
2021-06-07 07:27:09 +02:00
assert . Len ( t , items , 5 )
2022-04-01 02:15:46 +02:00
assert . Equal ( t , "a: svg octicon-file-directory-fill" , items [ 0 ] )
2023-06-23 00:05:52 +02:00
assert . Equal ( t , "link_b: svg octicon-file-directory-symlink" , items [ 1 ] )
2021-06-07 07:27:09 +02:00
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 09:04:36 +02:00
}
2019-01-27 22:13:15 +01:00
// TestViewAsRepoAdmin tests PR #2167
func TestViewAsRepoAdmin ( t * testing . T ) {
for user , expectedNoDescription := range map [ string ] bool {
"user2" : true ,
2019-02-19 08:19:28 +01:00
"user4" : false ,
2019-01-27 22:13:15 +01:00
} {
2022-09-02 21:18:23 +02:00
defer tests . PrepareTestEnv ( t ) ( )
2019-01-27 22:13:15 +01: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 10:31:10 +02:00
repoTopics := htmlDoc . doc . Find ( "#repo-topics" ) . Children ( )
repoSummary := htmlDoc . doc . Find ( ".repository-summary" ) . Children ( )
2019-01-27 22:13:15 +01:00
assert . Equal ( t , expectedNoDescription , noDescription . HasClass ( "no-description" ) )
2022-10-13 10:31:10 +02:00
assert . True ( t , repoTopics . HasClass ( "repo-topic" ) )
assert . True ( t , repoSummary . HasClass ( "repository-menu" ) )
2019-01-27 22:13:15 +01:00
}
}
2022-10-13 10:31:10 +02:00
2023-08-18 11:21:24 +02:00
func TestRepoHTMLTitle ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
t . Run ( "Repository homepage" , func ( t * testing . T ) {
t . Run ( "Without description" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo1" )
assert . EqualValues ( t , "user2/repo1 - Gitea: Git with a cup of tea" , htmlTitle )
} )
t . Run ( "With description" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user27/repo49" )
assert . EqualValues ( t , "user27/repo49: A wonderful repository with more than just a README.md - Gitea: Git with a cup of tea" , htmlTitle )
} )
} )
t . Run ( "Code view" , func ( t * testing . T ) {
t . Run ( "Directory" , func ( t * testing . T ) {
t . Run ( "Default branch" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo59/src/branch/master/deep/nesting" )
assert . EqualValues ( t , "repo59/deep/nesting at master - user2/repo59 - Gitea: Git with a cup of tea" , htmlTitle )
} )
t . Run ( "Non-default branch" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo59/src/branch/cake-recipe/deep/nesting" )
assert . EqualValues ( t , "repo59/deep/nesting at cake-recipe - user2/repo59 - Gitea: Git with a cup of tea" , htmlTitle )
} )
t . Run ( "Commit" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo59/src/commit/d8f53dfb33f6ccf4169c34970b5e747511c18beb/deep/nesting/" )
assert . EqualValues ( t , "repo59/deep/nesting at d8f53dfb33f6ccf4169c34970b5e747511c18beb - user2/repo59 - Gitea: Git with a cup of tea" , htmlTitle )
} )
t . Run ( "Tag" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo59/src/tag/v1.0/deep/nesting/" )
assert . EqualValues ( t , "repo59/deep/nesting at v1.0 - user2/repo59 - Gitea: Git with a cup of tea" , htmlTitle )
} )
} )
t . Run ( "File" , func ( t * testing . T ) {
t . Run ( "Default branch" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo59/src/branch/master/deep/nesting/folder/secret_sauce_recipe.txt" )
assert . EqualValues ( t , "repo59/deep/nesting/folder/secret_sauce_recipe.txt at master - user2/repo59 - Gitea: Git with a cup of tea" , htmlTitle )
} )
t . Run ( "Non-default branch" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo59/src/branch/cake-recipe/deep/nesting/folder/secret_sauce_recipe.txt" )
assert . EqualValues ( t , "repo59/deep/nesting/folder/secret_sauce_recipe.txt at cake-recipe - user2/repo59 - Gitea: Git with a cup of tea" , htmlTitle )
} )
t . Run ( "Commit" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo59/src/commit/d8f53dfb33f6ccf4169c34970b5e747511c18beb/deep/nesting/folder/secret_sauce_recipe.txt" )
assert . EqualValues ( t , "repo59/deep/nesting/folder/secret_sauce_recipe.txt at d8f53dfb33f6ccf4169c34970b5e747511c18beb - user2/repo59 - Gitea: Git with a cup of tea" , htmlTitle )
} )
t . Run ( "Tag" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo59/src/tag/v1.0/deep/nesting/folder/secret_sauce_recipe.txt" )
assert . EqualValues ( t , "repo59/deep/nesting/folder/secret_sauce_recipe.txt at v1.0 - user2/repo59 - Gitea: Git with a cup of tea" , htmlTitle )
} )
} )
} )
t . Run ( "Issues view" , func ( t * testing . T ) {
t . Run ( "Overview page" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo1/issues" )
assert . EqualValues ( t , "Issues - user2/repo1 - Gitea: Git with a cup of tea" , htmlTitle )
} )
t . Run ( "View issue page" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo1/issues/1" )
assert . EqualValues ( t , "#1 - issue1 - user2/repo1 - Gitea: Git with a cup of tea" , htmlTitle )
} )
} )
t . Run ( "Pull requests view" , func ( t * testing . T ) {
t . Run ( "Overview page" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo1/pulls" )
assert . EqualValues ( t , "Pull Requests - user2/repo1 - Gitea: Git with a cup of tea" , htmlTitle )
} )
t . Run ( "View pull request" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
htmlTitle := GetHTMLTitle ( t , nil , "/user2/repo1/pulls/2" )
assert . EqualValues ( t , "#2 - issue2 - user2/repo1 - Gitea: Git with a cup of tea" , htmlTitle )
} )
} )
}
2022-10-13 10:31:10 +02: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 ( ) )
}
2023-03-03 11:01:33 +01:00
2023-03-09 02:24:23 +01:00
// ensure that the all the different ways to find and render a README work
func TestViewRepoDirectoryReadme ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
// there are many combinations:
// - READMEs can be .md, .txt, or have no extension
// - READMEs can be tagged with a language and even a country code
// - READMEs can be stored in docs/, .gitea/, or .github/
// - READMEs can be symlinks to other files
// - READMEs can be broken symlinks which should not render
//
// this doesn't cover all possible cases, just the major branches of the code
session := loginUser ( t , "user2" )
check := func ( name , url , expectedFilename , expectedReadmeType , expectedContent string ) {
t . Run ( name , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , url )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
readmeName := htmlDoc . doc . Find ( "h4.file-header" )
readmeContent := htmlDoc . doc . Find ( ".file-view" ) // TODO: add a id="readme" to the output to make this test more precise
readmeType , _ := readmeContent . Attr ( "class" )
assert . Equal ( t , expectedFilename , strings . TrimSpace ( readmeName . Text ( ) ) )
assert . Contains ( t , readmeType , expectedReadmeType )
assert . Contains ( t , readmeContent . Text ( ) , expectedContent )
} )
}
// viewing the top level
check ( "Home" , "/user2/readme-test/" , "README.md" , "markdown" , "The cake is a lie." )
// viewing different file extensions
check ( "md" , "/user2/readme-test/src/branch/master/" , "README.md" , "markdown" , "The cake is a lie." )
check ( "txt" , "/user2/readme-test/src/branch/txt/" , "README.txt" , "plain-text" , "My spoon is too big." )
check ( "plain" , "/user2/readme-test/src/branch/plain/" , "README" , "plain-text" , "Birken my stocks gee howdy" )
check ( "i18n" , "/user2/readme-test/src/branch/i18n/" , "README.zh.md" , "markdown" , "蛋糕是一个谎言" )
2023-10-03 10:13:49 +02:00
// using HEAD ref
check ( "branch-HEAD" , "/user2/readme-test/src/branch/HEAD/" , "README.md" , "markdown" , "The cake is a lie." )
check ( "commit-HEAD" , "/user2/readme-test/src/commit/HEAD/" , "README.md" , "markdown" , "The cake is a lie." )
2023-03-09 02:24:23 +01:00
// viewing different subdirectories
check ( "subdir" , "/user2/readme-test/src/branch/subdir/libcake" , "README.md" , "markdown" , "Four pints of sugar." )
check ( "docs-direct" , "/user2/readme-test/src/branch/special-subdir-docs/docs/" , "README.md" , "markdown" , "This is in docs/" )
check ( "docs" , "/user2/readme-test/src/branch/special-subdir-docs/" , "docs/README.md" , "markdown" , "This is in docs/" )
check ( ".gitea" , "/user2/readme-test/src/branch/special-subdir-.gitea/" , ".gitea/README.md" , "markdown" , "This is in .gitea/" )
check ( ".github" , "/user2/readme-test/src/branch/special-subdir-.github/" , ".github/README.md" , "markdown" , "This is in .github/" )
// symlinks
// symlinks are subtle:
// - they should be able to handle going a reasonable number of times up and down in the tree
// - they shouldn't get stuck on link cycles
// - they should determine the filetype based on the name of the link, not the target
check ( "symlink" , "/user2/readme-test/src/branch/symlink/" , "README.md" , "markdown" , "This is in some/other/path" )
check ( "symlink-multiple" , "/user2/readme-test/src/branch/symlink/some/" , "README.txt" , "plain-text" , "This is in some/other/path" )
check ( "symlink-up-and-down" , "/user2/readme-test/src/branch/symlink/up/back/down/down" , "README.md" , "markdown" , "It's a me, mario" )
// testing fallback rules
// READMEs are searched in this order:
// - [README.zh-cn.md, README.zh_cn.md, README.zh.md, README_zh.md, README.md, README.txt, README,
// docs/README.zh-cn.md, docs/README.zh_cn.md, docs/README.zh.md, docs/README_zh.md, docs/README.md, docs/README.txt, docs/README,
// .gitea/README.zh-cn.md, .gitea/README.zh_cn.md, .gitea/README.zh.md, .gitea/README_zh.md, .gitea/README.md, .gitea/README.txt, .gitea/README,
// .github/README.zh-cn.md, .github/README.zh_cn.md, .github/README.zh.md, .github/README_zh.md, .github/README.md, .github/README.txt, .github/README]
// and a broken/looped symlink counts as not existing at all and should be skipped.
// again, this doesn't cover all cases, but it covers a few
check ( "fallback/top" , "/user2/readme-test/src/branch/fallbacks/" , "README.en.md" , "markdown" , "This is README.en.md" )
check ( "fallback/2" , "/user2/readme-test/src/branch/fallbacks2/" , "README.md" , "markdown" , "This is README.md" )
check ( "fallback/3" , "/user2/readme-test/src/branch/fallbacks3/" , "README" , "plain-text" , "This is README" )
check ( "fallback/4" , "/user2/readme-test/src/branch/fallbacks4/" , "docs/README.en.md" , "markdown" , "This is docs/README.en.md" )
check ( "fallback/5" , "/user2/readme-test/src/branch/fallbacks5/" , "docs/README.md" , "markdown" , "This is docs/README.md" )
check ( "fallback/6" , "/user2/readme-test/src/branch/fallbacks6/" , "docs/README" , "plain-text" , "This is docs/README" )
check ( "fallback/7" , "/user2/readme-test/src/branch/fallbacks7/" , ".gitea/README.en.md" , "markdown" , "This is .gitea/README.en.md" )
check ( "fallback/8" , "/user2/readme-test/src/branch/fallbacks8/" , ".gitea/README.md" , "markdown" , "This is .gitea/README.md" )
check ( "fallback/9" , "/user2/readme-test/src/branch/fallbacks9/" , ".gitea/README" , "plain-text" , "This is .gitea/README" )
// this case tests that broken symlinks count as missing files, instead of rendering their contents
check ( "fallbacks-broken-symlinks" , "/user2/readme-test/src/branch/fallbacks-broken-symlinks/" , "docs/README" , "plain-text" , "This is docs/README" )
// some cases that should NOT render a README
// - /readme
// - /.github/docs/README.md
// - a symlink loop
missing := func ( name , url string ) {
t . Run ( "missing/" + name , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , url )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
_ , exists := htmlDoc . doc . Find ( ".file-view" ) . Attr ( "class" )
assert . False ( t , exists , "README should not have rendered" )
} )
}
missing ( "sp-ace" , "/user2/readme-test/src/branch/sp-ace/" )
missing ( "nested-special" , "/user2/readme-test/src/branch/special-subdir-nested/subproject" ) // the special subdirs should only trigger on the repo root
2023-04-11 05:00:19 +02:00
missing ( "special-subdir-nested" , "/user2/readme-test/src/branch/special-subdir-nested/" )
2023-03-09 02:24:23 +01:00
missing ( "symlink-loop" , "/user2/readme-test/src/branch/symlink-loop/" )
}
2023-03-15 22:51:39 +01:00
func TestMarkDownReadmeImage ( t * testing . T ) {
2023-03-03 11:01:33 +01:00
defer tests . PrepareTestEnv ( t ) ( )
session := loginUser ( t , "user2" )
req := NewRequest ( t , "GET" , "/user2/repo1/src/branch/home-md-img-check" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
2023-03-15 22:51:39 +01:00
src , exists := htmlDoc . doc . Find ( ` .markdown img ` ) . Attr ( "src" )
assert . True ( t , exists , "Image not found in README" )
2023-04-22 23:56:27 +02:00
assert . Equal ( t , "/user2/repo1/media/branch/home-md-img-check/test-fake-img.jpg" , src )
2023-03-03 11:01:33 +01:00
req = NewRequest ( t , "GET" , "/user2/repo1/src/branch/home-md-img-check/README.md" )
resp = session . MakeRequest ( t , req , http . StatusOK )
htmlDoc = NewHTMLParser ( t , resp . Body )
2023-03-15 22:51:39 +01:00
src , exists = htmlDoc . doc . Find ( ` .markdown img ` ) . Attr ( "src" )
assert . True ( t , exists , "Image not found in markdown file" )
2023-04-22 23:56:27 +02:00
assert . Equal ( t , "/user2/repo1/media/branch/home-md-img-check/test-fake-img.jpg" , src )
2023-03-15 22:51:39 +01:00
}
func TestMarkDownReadmeImageSubfolder ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
session := loginUser ( t , "user2" )
// this branch has the README in the special docs/README.md location
req := NewRequest ( t , "GET" , "/user2/repo1/src/branch/sub-home-md-img-check" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
src , exists := htmlDoc . doc . Find ( ` .markdown img ` ) . Attr ( "src" )
assert . True ( t , exists , "Image not found in README" )
2023-04-22 23:56:27 +02:00
assert . Equal ( t , "/user2/repo1/media/branch/sub-home-md-img-check/docs/test-fake-img.jpg" , src )
2023-03-15 22:51:39 +01:00
req = NewRequest ( t , "GET" , "/user2/repo1/src/branch/sub-home-md-img-check/docs/README.md" )
resp = session . MakeRequest ( t , req , http . StatusOK )
htmlDoc = NewHTMLParser ( t , resp . Body )
src , exists = htmlDoc . doc . Find ( ` .markdown img ` ) . Attr ( "src" )
assert . True ( t , exists , "Image not found in markdown file" )
2023-04-22 23:56:27 +02:00
assert . Equal ( t , "/user2/repo1/media/branch/sub-home-md-img-check/docs/test-fake-img.jpg" , src )
2023-03-03 11:01:33 +01:00
}
2023-08-08 11:04:04 +02:00
func TestGeneratedSourceLink ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
t . Run ( "Rendered file" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , "/user2/repo1/src/branch/master/README.md?display=source" )
resp := MakeRequest ( t , req , http . StatusOK )
doc := NewHTMLParser ( t , resp . Body )
dataURL , exists := doc . doc . Find ( ".copy-line-permalink" ) . Attr ( "data-url" )
assert . True ( t , exists )
assert . Equal ( t , "/user2/repo1/src/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d/README.md?display=source" , dataURL )
dataURL , exists = doc . doc . Find ( ".ref-in-new-issue" ) . Attr ( "data-url-param-body-link" )
assert . True ( t , exists )
assert . Equal ( t , "/user2/repo1/src/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d/README.md?display=source" , dataURL )
} )
t . Run ( "Non-Rendered file" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
session := loginUser ( t , "user27" )
req := NewRequest ( t , "GET" , "/user27/repo49/src/branch/master/test/test.txt" )
resp := session . MakeRequest ( t , req , http . StatusOK )
doc := NewHTMLParser ( t , resp . Body )
dataURL , exists := doc . doc . Find ( ".copy-line-permalink" ) . Attr ( "data-url" )
assert . True ( t , exists )
assert . Equal ( t , "/user27/repo49/src/commit/aacbdfe9e1c4b47f60abe81849045fa4e96f1d75/test/test.txt" , dataURL )
dataURL , exists = doc . doc . Find ( ".ref-in-new-issue" ) . Attr ( "data-url-param-body-link" )
assert . True ( t , exists )
assert . Equal ( t , "/user27/repo49/src/commit/aacbdfe9e1c4b47f60abe81849045fa4e96f1d75/test/test.txt" , dataURL )
} )
}
2023-09-13 00:53:03 +02:00
func TestDangerZoneConfirmation ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
mustInvalidRepoName := func ( resp * httptest . ResponseRecorder ) {
t . Helper ( )
htmlDoc := NewHTMLParser ( t , resp . Body )
assert . Contains ( t ,
htmlDoc . doc . Find ( ".ui.negative.message" ) . Text ( ) ,
translation . NewLocale ( "en-US" ) . Tr ( "form.enterred_invalid_repo_name" ) ,
)
}
t . Run ( "Transfer ownership" , func ( t * testing . T ) {
session := loginUser ( t , "user2" )
t . Run ( "Fail" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequestWithValues ( t , "POST" , "/user2/repo1/settings" , map [ string ] string {
"_csrf" : GetCSRF ( t , session , "/user2/repo1/settings" ) ,
"action" : "transfer" ,
"repo_name" : "repo1" ,
"new_owner_name" : "user1" ,
} )
resp := session . MakeRequest ( t , req , http . StatusOK )
mustInvalidRepoName ( resp )
} )
t . Run ( "Pass" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequestWithValues ( t , "POST" , "/user2/repo1/settings" , map [ string ] string {
"_csrf" : GetCSRF ( t , session , "/user2/repo1/settings" ) ,
"action" : "transfer" ,
"repo_name" : "user2/repo1" ,
"new_owner_name" : "user1" ,
} )
session . MakeRequest ( t , req , http . StatusSeeOther )
flashCookie := session . GetCookie ( gitea_context . CookieNameFlash )
assert . NotNil ( t , flashCookie )
assert . EqualValues ( t , flashCookie . Value , "success%3DThis%2Brepository%2Bhas%2Bbeen%2Bmarked%2Bfor%2Btransfer%2Band%2Bawaits%2Bconfirmation%2Bfrom%2B%2522User%2BOne%2522" )
} )
} )
t . Run ( "Convert fork" , func ( t * testing . T ) {
session := loginUser ( t , "user20" )
t . Run ( "Fail" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequestWithValues ( t , "POST" , "/user20/big_test_public_fork_7/settings" , map [ string ] string {
"_csrf" : GetCSRF ( t , session , "/user20/big_test_public_fork_7/settings" ) ,
"action" : "convert_fork" ,
"repo_name" : "big_test_public_fork_7" ,
} )
resp := session . MakeRequest ( t , req , http . StatusOK )
mustInvalidRepoName ( resp )
} )
t . Run ( "Pass" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequestWithValues ( t , "POST" , "/user20/big_test_public_fork_7/settings" , map [ string ] string {
"_csrf" : GetCSRF ( t , session , "/user20/big_test_public_fork_7/settings" ) ,
"action" : "convert_fork" ,
"repo_name" : "user20/big_test_public_fork_7" ,
} )
session . MakeRequest ( t , req , http . StatusSeeOther )
flashCookie := session . GetCookie ( gitea_context . CookieNameFlash )
assert . NotNil ( t , flashCookie )
assert . EqualValues ( t , flashCookie . Value , "success%3DThe%2Bfork%2Bhas%2Bbeen%2Bconverted%2Binto%2Ba%2Bregular%2Brepository." )
} )
} )
t . Run ( "Delete wiki" , func ( t * testing . T ) {
session := loginUser ( t , "user2" )
t . Run ( "Fail" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequestWithValues ( t , "POST" , "/user2/repo1/settings" , map [ string ] string {
"_csrf" : GetCSRF ( t , session , "/user2/repo1/settings" ) ,
"action" : "delete-wiki" ,
"repo_name" : "repo1" ,
} )
resp := session . MakeRequest ( t , req , http . StatusOK )
mustInvalidRepoName ( resp )
} )
t . Run ( "Pass" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequestWithValues ( t , "POST" , "/user2/repo1/settings" , map [ string ] string {
"_csrf" : GetCSRF ( t , session , "/user2/repo1/settings" ) ,
"action" : "delete-wiki" ,
"repo_name" : "user2/repo1" ,
} )
session . MakeRequest ( t , req , http . StatusSeeOther )
flashCookie := session . GetCookie ( gitea_context . CookieNameFlash )
assert . NotNil ( t , flashCookie )
assert . EqualValues ( t , flashCookie . Value , "success%3DThe%2Brepository%2Bwiki%2Bdata%2Bhas%2Bbeen%2Bdeleted." )
} )
} )
t . Run ( "Delete" , func ( t * testing . T ) {
session := loginUser ( t , "user2" )
t . Run ( "Fail" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequestWithValues ( t , "POST" , "/user2/repo1/settings" , map [ string ] string {
"_csrf" : GetCSRF ( t , session , "/user2/repo1/settings" ) ,
"action" : "delete" ,
"repo_name" : "repo1" ,
} )
resp := session . MakeRequest ( t , req , http . StatusOK )
mustInvalidRepoName ( resp )
} )
t . Run ( "Pass" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequestWithValues ( t , "POST" , "/user2/repo1/settings" , map [ string ] string {
"_csrf" : GetCSRF ( t , session , "/user2/repo1/settings" ) ,
"action" : "delete" ,
"repo_name" : "user2/repo1" ,
} )
session . MakeRequest ( t , req , http . StatusSeeOther )
flashCookie := session . GetCookie ( gitea_context . CookieNameFlash )
assert . NotNil ( t , flashCookie )
assert . EqualValues ( t , flashCookie . Value , "success%3DThe%2Brepository%2Bhas%2Bbeen%2Bdeleted." )
} )
} )
}
2023-09-14 21:53:57 +02:00
func TestRenamedFileHistory ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
t . Run ( "Renamed file" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , "/user2/repo59/commits/branch/master/license" )
resp := MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
renameNotice := htmlDoc . doc . Find ( ".ui.bottom.attached.header" )
assert . Equal ( t , 1 , renameNotice . Length ( ) )
assert . Contains ( t , renameNotice . Text ( ) , "Renamed from licnse (Browse further)" )
oldFileHistoryLink , ok := renameNotice . Find ( "a" ) . Attr ( "href" )
assert . True ( t , ok )
assert . Equal ( t , "/user2/repo59/commits/commit/80b83c5c8220c3aa3906e081f202a2a7563ec879/licnse" , oldFileHistoryLink )
} )
t . Run ( "Non renamed file" , func ( t * testing . T ) {
req := NewRequest ( t , "GET" , "/user2/repo59/commits/branch/master/README.md" )
resp := MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
htmlDoc . AssertElement ( t , ".ui.bottom.attached.header" , false )
} )
}