@ -7,6 +7,7 @@ import (
"io"
"io"
"net/http"
"net/http"
"net/url"
"net/url"
"slices"
"testing"
"testing"
"time"
"time"
@ -20,9 +21,9 @@ import (
api "code.gitea.io/gitea/modules/structs"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/util"
repo_service "code.gitea.io/gitea/services/repository"
repo_service "code.gitea.io/gitea/services/repository"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
)
func getExpectedContentsResponseForContents ( ref , refType , lastCommitSHA string ) * api . ContentsResponse {
func getExpectedContentsResponseForContents ( ref , refType , lastCommitSHA string ) * api . ContentsResponse {
@ -54,7 +55,11 @@ func getExpectedContentsResponseForContents(ref, refType, lastCommitSHA string)
}
}
func TestAPIGetContents ( t * testing . T ) {
func TestAPIGetContents ( t * testing . T ) {
onGiteaRun ( t , testAPIGetContents )
onGiteaRun ( t , func ( t * testing . T , u * url . URL ) {
testAPIGetContentsRefFormats ( t )
testAPIGetContents ( t , u )
testAPIGetContentsExt ( t )
} )
}
}
func testAPIGetContents ( t * testing . T , u * url . URL ) {
func testAPIGetContents ( t * testing . T , u * url . URL ) {
@ -76,20 +81,20 @@ func testAPIGetContents(t *testing.T, u *url.URL) {
// Get the commit ID of the default branch
// Get the commit ID of the default branch
gitRepo , err := gitrepo . OpenRepository ( git . DefaultContext , repo1 )
gitRepo , err := gitrepo . OpenRepository ( git . DefaultContext , repo1 )
assert . NoError ( t , err )
require . NoError ( t , err )
defer gitRepo . Close ( )
defer gitRepo . Close ( )
// Make a new branch in repo1
// Make a new branch in repo1
newBranch := "test_branch"
newBranch := "test_branch"
err = repo_service . CreateNewBranch ( git . DefaultContext , user2 , repo1 , gitRepo , repo1 . DefaultBranch , newBranch )
err = repo_service . CreateNewBranch ( git . DefaultContext , user2 , repo1 , gitRepo , repo1 . DefaultBranch , newBranch )
assert . NoError ( t , err )
require . NoError ( t , err )
commitID , err := gitRepo . GetBranchCommitID ( repo1 . DefaultBranch )
commitID , err := gitRepo . GetBranchCommitID ( repo1 . DefaultBranch )
assert . NoError ( t , err )
require . NoError ( t , err )
// Make a new tag in repo1
// Make a new tag in repo1
newTag := "test_tag"
newTag := "test_tag"
err = gitRepo . CreateTag ( newTag , commitID )
err = gitRepo . CreateTag ( newTag , commitID )
assert . NoError ( t , err )
require . NoError ( t , err )
/*** END SETUP ***/
/*** END SETUP ***/
// ref is default ref
// ref is default ref
@ -99,7 +104,6 @@ func testAPIGetContents(t *testing.T, u *url.URL) {
resp := MakeRequest ( t , req , http . StatusOK )
resp := MakeRequest ( t , req , http . StatusOK )
var contentsResponse api . ContentsResponse
var contentsResponse api . ContentsResponse
DecodeJSON ( t , resp , & contentsResponse )
DecodeJSON ( t , resp , & contentsResponse )
assert . NotNil ( t , contentsResponse )
lastCommit , _ := gitRepo . GetCommitByPath ( "README.md" )
lastCommit , _ := gitRepo . GetCommitByPath ( "README.md" )
expectedContentsResponse := getExpectedContentsResponseForContents ( ref , refType , lastCommit . ID . String ( ) )
expectedContentsResponse := getExpectedContentsResponseForContents ( ref , refType , lastCommit . ID . String ( ) )
assert . Equal ( t , * expectedContentsResponse , contentsResponse )
assert . Equal ( t , * expectedContentsResponse , contentsResponse )
@ -109,7 +113,6 @@ func testAPIGetContents(t *testing.T, u *url.URL) {
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/contents/%s" , user2 . Name , repo1 . Name , treePath )
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/contents/%s" , user2 . Name , repo1 . Name , treePath )
resp = MakeRequest ( t , req , http . StatusOK )
resp = MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & contentsResponse )
DecodeJSON ( t , resp , & contentsResponse )
assert . NotNil ( t , contentsResponse )
expectedContentsResponse = getExpectedContentsResponseForContents ( repo1 . DefaultBranch , refType , lastCommit . ID . String ( ) )
expectedContentsResponse = getExpectedContentsResponseForContents ( repo1 . DefaultBranch , refType , lastCommit . ID . String ( ) )
assert . Equal ( t , * expectedContentsResponse , contentsResponse )
assert . Equal ( t , * expectedContentsResponse , contentsResponse )
@ -119,7 +122,6 @@ func testAPIGetContents(t *testing.T, u *url.URL) {
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/contents/%s?ref=%s" , user2 . Name , repo1 . Name , treePath , ref )
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/contents/%s?ref=%s" , user2 . Name , repo1 . Name , treePath , ref )
resp = MakeRequest ( t , req , http . StatusOK )
resp = MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & contentsResponse )
DecodeJSON ( t , resp , & contentsResponse )
assert . NotNil ( t , contentsResponse )
branchCommit , _ := gitRepo . GetBranchCommit ( ref )
branchCommit , _ := gitRepo . GetBranchCommit ( ref )
lastCommit , _ = branchCommit . GetCommitByPath ( "README.md" )
lastCommit , _ = branchCommit . GetCommitByPath ( "README.md" )
expectedContentsResponse = getExpectedContentsResponseForContents ( ref , refType , lastCommit . ID . String ( ) )
expectedContentsResponse = getExpectedContentsResponseForContents ( ref , refType , lastCommit . ID . String ( ) )
@ -131,7 +133,6 @@ func testAPIGetContents(t *testing.T, u *url.URL) {
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/contents/%s?ref=%s" , user2 . Name , repo1 . Name , treePath , ref )
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/contents/%s?ref=%s" , user2 . Name , repo1 . Name , treePath , ref )
resp = MakeRequest ( t , req , http . StatusOK )
resp = MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & contentsResponse )
DecodeJSON ( t , resp , & contentsResponse )
assert . NotNil ( t , contentsResponse )
tagCommit , _ := gitRepo . GetTagCommit ( ref )
tagCommit , _ := gitRepo . GetTagCommit ( ref )
lastCommit , _ = tagCommit . GetCommitByPath ( "README.md" )
lastCommit , _ = tagCommit . GetCommitByPath ( "README.md" )
expectedContentsResponse = getExpectedContentsResponseForContents ( ref , refType , lastCommit . ID . String ( ) )
expectedContentsResponse = getExpectedContentsResponseForContents ( ref , refType , lastCommit . ID . String ( ) )
@ -143,7 +144,6 @@ func testAPIGetContents(t *testing.T, u *url.URL) {
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/contents/%s?ref=%s" , user2 . Name , repo1 . Name , treePath , ref )
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/contents/%s?ref=%s" , user2 . Name , repo1 . Name , treePath , ref )
resp = MakeRequest ( t , req , http . StatusOK )
resp = MakeRequest ( t , req , http . StatusOK )
DecodeJSON ( t , resp , & contentsResponse )
DecodeJSON ( t , resp , & contentsResponse )
assert . NotNil ( t , contentsResponse )
expectedContentsResponse = getExpectedContentsResponseForContents ( ref , refType , commitID )
expectedContentsResponse = getExpectedContentsResponseForContents ( ref , refType , commitID )
assert . Equal ( t , * expectedContentsResponse , contentsResponse )
assert . Equal ( t , * expectedContentsResponse , contentsResponse )
@ -168,9 +168,7 @@ func testAPIGetContents(t *testing.T, u *url.URL) {
MakeRequest ( t , req , http . StatusOK )
MakeRequest ( t , req , http . StatusOK )
}
}
func TestAPIGetContentsRefFormats ( t * testing . T ) {
func testAPIGetContentsRefFormats ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
file := "README.md"
file := "README.md"
sha := "65f1bf27bc3bf70f64657658635e66094edbcb4d"
sha := "65f1bf27bc3bf70f64657658635e66094edbcb4d"
content := "# repo1\n\nDescription for repo1"
content := "# repo1\n\nDescription for repo1"
@ -203,3 +201,76 @@ func TestAPIGetContentsRefFormats(t *testing.T) {
// FIXME: this is an incorrect behavior, non-existing branch falls back to default branch
// FIXME: this is an incorrect behavior, non-existing branch falls back to default branch
_ = MakeRequest ( t , NewRequest ( t , http . MethodGet , "/api/v1/repos/user2/repo1/raw/README.md?ref=no-such" ) , http . StatusOK )
_ = MakeRequest ( t , NewRequest ( t , http . MethodGet , "/api/v1/repos/user2/repo1/raw/README.md?ref=no-such" ) , http . StatusOK )
}
}
func testAPIGetContentsExt ( t * testing . T ) {
session := loginUser ( t , "user2" )
token2 := getTokenForLoggedInUser ( t , session , auth_model . AccessTokenScopeWriteRepository )
t . Run ( "DirContents" , func ( t * testing . T ) {
req := NewRequestf ( t , "GET" , "/api/v1/repos/user2/repo1/contents-ext/docs?ref=sub-home-md-img-check" )
resp := MakeRequest ( t , req , http . StatusOK )
var contentsResponse api . ContentsExtResponse
DecodeJSON ( t , resp , & contentsResponse )
assert . Nil ( t , contentsResponse . FileContents )
assert . Equal ( t , "README.md" , contentsResponse . DirContents [ 0 ] . Name )
assert . Nil ( t , contentsResponse . DirContents [ 0 ] . Encoding )
assert . Nil ( t , contentsResponse . DirContents [ 0 ] . Content )
// "includes=file_content" shouldn't affect directory listing
req = NewRequestf ( t , "GET" , "/api/v1/repos/user2/repo1/contents-ext/docs?ref=sub-home-md-img-check&includes=file_content" )
resp = MakeRequest ( t , req , http . StatusOK )
contentsResponse = api . ContentsExtResponse { }
DecodeJSON ( t , resp , & contentsResponse )
assert . Nil ( t , contentsResponse . FileContents )
assert . Equal ( t , "README.md" , contentsResponse . DirContents [ 0 ] . Name )
assert . Nil ( t , contentsResponse . DirContents [ 0 ] . Encoding )
assert . Nil ( t , contentsResponse . DirContents [ 0 ] . Content )
req = NewRequestf ( t , "GET" , "/api/v1/repos/user2/lfs/contents-ext?includes=file_content,lfs_metadata" ) . AddTokenAuth ( token2 )
resp = session . MakeRequest ( t , req , http . StatusOK )
contentsResponse = api . ContentsExtResponse { }
DecodeJSON ( t , resp , & contentsResponse )
assert . Nil ( t , contentsResponse . FileContents )
respFileIdx := slices . IndexFunc ( contentsResponse . DirContents , func ( response * api . ContentsResponse ) bool { return response . Name == "jpeg.jpg" } )
require . NotEqual ( t , - 1 , respFileIdx )
respFile := contentsResponse . DirContents [ respFileIdx ]
assert . Equal ( t , "jpeg.jpg" , respFile . Name )
assert . Nil ( t , respFile . Encoding )
assert . Nil ( t , respFile . Content )
assert . Equal ( t , util . ToPointer ( int64 ( 107 ) ) , respFile . LfsSize )
assert . Equal ( t , util . ToPointer ( "0b8d8b5f15046343fd32f451df93acc2bdd9e6373be478b968e4cad6b6647351" ) , respFile . LfsOid )
} )
t . Run ( "FileContents" , func ( t * testing . T ) {
// by default, no file content is returned
req := NewRequestf ( t , "GET" , "/api/v1/repos/user2/repo1/contents-ext/docs/README.md?ref=sub-home-md-img-check" )
resp := MakeRequest ( t , req , http . StatusOK )
var contentsResponse api . ContentsExtResponse
DecodeJSON ( t , resp , & contentsResponse )
assert . Nil ( t , contentsResponse . DirContents )
assert . Equal ( t , "README.md" , contentsResponse . FileContents . Name )
assert . Nil ( t , contentsResponse . FileContents . Encoding )
assert . Nil ( t , contentsResponse . FileContents . Content )
// file content is only returned when `includes=file_content`
req = NewRequestf ( t , "GET" , "/api/v1/repos/user2/repo1/contents-ext/docs/README.md?ref=sub-home-md-img-check&includes=file_content" )
resp = MakeRequest ( t , req , http . StatusOK )
contentsResponse = api . ContentsExtResponse { }
DecodeJSON ( t , resp , & contentsResponse )
assert . Nil ( t , contentsResponse . DirContents )
assert . Equal ( t , "README.md" , contentsResponse . FileContents . Name )
assert . NotNil ( t , contentsResponse . FileContents . Encoding )
assert . NotNil ( t , contentsResponse . FileContents . Content )
req = NewRequestf ( t , "GET" , "/api/v1/repos/user2/lfs/contents-ext/jpeg.jpg?includes=file_content" ) . AddTokenAuth ( token2 )
resp = session . MakeRequest ( t , req , http . StatusOK )
contentsResponse = api . ContentsExtResponse { }
DecodeJSON ( t , resp , & contentsResponse )
assert . Nil ( t , contentsResponse . DirContents )
assert . NotNil ( t , contentsResponse . FileContents )
respFile := contentsResponse . FileContents
assert . Equal ( t , "jpeg.jpg" , respFile . Name )
assert . NotNil ( t , respFile . Encoding )
assert . NotNil ( t , respFile . Content )
assert . Equal ( t , util . ToPointer ( int64 ( 107 ) ) , respFile . LfsSize )
assert . Equal ( t , util . ToPointer ( "0b8d8b5f15046343fd32f451df93acc2bdd9e6373be478b968e4cad6b6647351" ) , respFile . LfsOid )
} )
}