@ -10,9 +10,14 @@ import (
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/optional"
"code.gitea.io/gitea/modules/optional"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
)
func getTestCases ( ) [ ] struct {
func getTestCases ( ) [ ] struct {
@ -182,7 +187,16 @@ func getTestCases() []struct {
func TestSearchRepository ( t * testing . T ) {
func TestSearchRepository ( t * testing . T ) {
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
assert . NoError ( t , unittest . PrepareTestDatabase ( ) )
t . Run ( "SearchRepositoryPublic" , testSearchRepositoryPublic )
t . Run ( "SearchRepositoryPublicRestricted" , testSearchRepositoryRestricted )
t . Run ( "SearchRepositoryPrivate" , testSearchRepositoryPrivate )
t . Run ( "SearchRepositoryNonExistingOwner" , testSearchRepositoryNonExistingOwner )
t . Run ( "SearchRepositoryWithInDescription" , testSearchRepositoryWithInDescription )
t . Run ( "SearchRepositoryNotInDescription" , testSearchRepositoryNotInDescription )
t . Run ( "SearchRepositoryCases" , testSearchRepositoryCases )
}
func testSearchRepositoryPublic ( t * testing . T ) {
// test search public repository on explore page
// test search public repository on explore page
repos , count , err := repo_model . SearchRepositoryByName ( t . Context ( ) , repo_model . SearchRepoOptions {
repos , count , err := repo_model . SearchRepositoryByName ( t . Context ( ) , repo_model . SearchRepoOptions {
ListOptions : db . ListOptions {
ListOptions : db . ListOptions {
@ -211,9 +225,54 @@ func TestSearchRepository(t *testing.T) {
assert . NoError ( t , err )
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 2 ) , count )
assert . Equal ( t , int64 ( 2 ) , count )
assert . Len ( t , repos , 2 )
assert . Len ( t , repos , 2 )
}
func testSearchRepositoryRestricted ( t * testing . T ) {
user2 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
restrictedUser := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 29 , IsRestricted : true } )
performSearch := func ( t * testing . T , user * user_model . User ) ( publicRepoIDs [ ] int64 ) {
repos , count , err := repo_model . SearchRepositoryByName ( t . Context ( ) , repo_model . SearchRepoOptions {
ListOptions : db . ListOptions { Page : 1 , PageSize : 10000 } ,
Actor : user ,
} )
require . NoError ( t , err )
assert . Len ( t , repos , int ( count ) )
for _ , repo := range repos {
require . NoError ( t , repo . LoadOwner ( t . Context ( ) ) )
if repo . Owner . Visibility == structs . VisibleTypePublic && ! repo . IsPrivate {
publicRepoIDs = append ( publicRepoIDs , repo . ID )
}
}
return publicRepoIDs
}
normalPublicRepoIDs := performSearch ( t , user2 )
require . Greater ( t , len ( normalPublicRepoIDs ) , 10 ) // quite a lot
t . Run ( "RestrictedUser-NoSignInRequirement" , func ( t * testing . T ) {
// restricted user can also see public repositories if no "required sign-in"
repoIDs := performSearch ( t , restrictedUser )
assert . ElementsMatch ( t , normalPublicRepoIDs , repoIDs )
} )
defer test . MockVariableValue ( & setting . Service . RequireSignInViewStrict , true ) ( )
t . Run ( "NormalUser-RequiredSignIn" , func ( t * testing . T ) {
// normal user can still see all public repos, not affected by "required sign-in"
repoIDs := performSearch ( t , user2 )
assert . ElementsMatch ( t , normalPublicRepoIDs , repoIDs )
} )
t . Run ( "RestrictedUser-RequiredSignIn" , func ( t * testing . T ) {
// restricted user can see only their own repo
repoIDs := performSearch ( t , restrictedUser )
assert . Equal ( t , [ ] int64 { 4 } , repoIDs )
} )
}
func testSearchRepositoryPrivate ( t * testing . T ) {
// test search private repository on explore page
// test search private repository on explore page
repos , count , err = repo_model . SearchRepositoryByName ( t . Context ( ) , repo_model . SearchRepoOptions {
repos , count , err : = repo_model . SearchRepositoryByName ( t . Context ( ) , repo_model . SearchRepoOptions {
ListOptions : db . ListOptions {
ListOptions : db . ListOptions {
Page : 1 ,
Page : 1 ,
PageSize : 10 ,
PageSize : 10 ,
@ -242,16 +301,18 @@ func TestSearchRepository(t *testing.T) {
assert . NoError ( t , err )
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 3 ) , count )
assert . Equal ( t , int64 ( 3 ) , count )
assert . Len ( t , repos , 3 )
assert . Len ( t , repos , 3 )
}
// Test non existing owner
func testSearchRepositoryNonExistingOwner ( t * testing . T ) {
repos , count , err = repo_model . SearchRepositoryByName ( t . Context ( ) , repo_model . SearchRepoOptions { OwnerID : unittest . NonexistentID } )
repos , count , err : = repo_model . SearchRepositoryByName ( t . Context ( ) , repo_model . SearchRepoOptions { OwnerID : unittest . NonexistentID } )
assert . NoError ( t , err )
assert . NoError ( t , err )
assert . Empty ( t , repos )
assert . Empty ( t , repos )
assert . Equal ( t , int64 ( 0 ) , count )
assert . Equal ( t , int64 ( 0 ) , count )
}
// Test search within description
func testSearchRepositoryWithInDescription ( t * testing . T ) {
repos , count , err = repo_model . SearchRepository ( t . Context ( ) , repo_model . SearchRepoOptions {
repos , count , err : = repo_model . SearchRepository ( t . Context ( ) , repo_model . SearchRepoOptions {
ListOptions : db . ListOptions {
ListOptions : db . ListOptions {
Page : 1 ,
Page : 1 ,
PageSize : 10 ,
PageSize : 10 ,
@ -266,9 +327,10 @@ func TestSearchRepository(t *testing.T) {
assert . Equal ( t , "test_repo_14" , repos [ 0 ] . Name )
assert . Equal ( t , "test_repo_14" , repos [ 0 ] . Name )
}
}
assert . Equal ( t , int64 ( 1 ) , count )
assert . Equal ( t , int64 ( 1 ) , count )
}
// Test NOT search within description
func testSearchRepositoryNotInDescription ( t * testing . T ) {
repos , count , err = repo_model . SearchRepository ( t . Context ( ) , repo_model . SearchRepoOptions {
repos , count , err : = repo_model . SearchRepository ( t . Context ( ) , repo_model . SearchRepoOptions {
ListOptions : db . ListOptions {
ListOptions : db . ListOptions {
Page : 1 ,
Page : 1 ,
PageSize : 10 ,
PageSize : 10 ,
@ -281,7 +343,9 @@ func TestSearchRepository(t *testing.T) {
assert . NoError ( t , err )
assert . NoError ( t , err )
assert . Empty ( t , repos )
assert . Empty ( t , repos )
assert . Equal ( t , int64 ( 0 ) , count )
assert . Equal ( t , int64 ( 0 ) , count )
}
func testSearchRepositoryCases ( t * testing . T ) {
testCases := getTestCases ( )
testCases := getTestCases ( )
for _ , testCase := range testCases {
for _ , testCase := range testCases {