2021-12-10 09:27:50 +08:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2024-05-24 13:28:15 +02:00
// Copyright 2024 The Forgejo Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2021-12-10 09:27:50 +08:00
2022-06-06 16:01:49 +08:00
package repo_test
2021-12-10 09:27:50 +08:00
import (
"testing"
"code.gitea.io/gitea/models/db"
2022-06-06 16:01:49 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2022-06-15 15:02:00 +08:00
"code.gitea.io/gitea/models/unit"
2021-12-10 09:27:50 +08:00
"code.gitea.io/gitea/models/unittest"
2022-06-15 15:02:00 +08:00
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/markup"
2024-03-02 16:42:31 +01:00
"code.gitea.io/gitea/modules/optional"
2023-12-15 14:18:12 +08:00
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/test"
2021-12-10 09:27:50 +08:00
"github.com/stretchr/testify/assert"
2024-07-30 19:41:10 +00:00
"github.com/stretchr/testify/require"
2021-12-10 09:27:50 +08:00
)
2022-05-20 22:08:52 +08:00
var (
2022-06-06 16:01:49 +08:00
countRepospts = repo_model . CountRepositoryOptions { OwnerID : 10 }
2024-03-02 16:42:31 +01:00
countReposptsPublic = repo_model . CountRepositoryOptions { OwnerID : 10 , Private : optional . Some ( false ) }
countReposptsPrivate = repo_model . CountRepositoryOptions { OwnerID : 10 , Private : optional . Some ( true ) }
2022-05-20 22:08:52 +08:00
)
2021-12-10 09:27:50 +08:00
func TestGetRepositoryCount ( t * testing . T ) {
2024-07-30 19:41:10 +00:00
require . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-12-10 09:27:50 +08:00
2022-05-20 22:08:52 +08:00
ctx := db . DefaultContext
2022-06-06 16:01:49 +08:00
count , err1 := repo_model . CountRepositories ( ctx , countRepospts )
privateCount , err2 := repo_model . CountRepositories ( ctx , countReposptsPrivate )
publicCount , err3 := repo_model . CountRepositories ( ctx , countReposptsPublic )
2024-07-30 19:41:10 +00:00
require . NoError ( t , err1 )
require . NoError ( t , err2 )
require . NoError ( t , err3 )
2021-12-10 09:27:50 +08:00
assert . Equal ( t , int64 ( 3 ) , count )
assert . Equal ( t , privateCount + publicCount , count )
}
func TestGetPublicRepositoryCount ( t * testing . T ) {
2024-07-30 19:41:10 +00:00
require . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-12-10 09:27:50 +08:00
2022-06-06 16:01:49 +08:00
count , err := repo_model . CountRepositories ( db . DefaultContext , countReposptsPublic )
2024-07-30 19:41:10 +00:00
require . NoError ( t , err )
2021-12-10 09:27:50 +08:00
assert . Equal ( t , int64 ( 1 ) , count )
}
func TestGetPrivateRepositoryCount ( t * testing . T ) {
2024-07-30 19:41:10 +00:00
require . NoError ( t , unittest . PrepareTestDatabase ( ) )
2021-12-10 09:27:50 +08:00
2022-06-06 16:01:49 +08:00
count , err := repo_model . CountRepositories ( db . DefaultContext , countReposptsPrivate )
2024-07-30 19:41:10 +00:00
require . NoError ( t , err )
2021-12-10 09:27:50 +08:00
assert . Equal ( t , int64 ( 2 ) , count )
}
2021-12-12 23:48:20 +08:00
func TestRepoAPIURL ( t * testing . T ) {
2024-07-30 19:41:10 +00:00
require . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-08-16 10:22:25 +08:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 10 } )
2021-12-12 23:48:20 +08:00
assert . Equal ( t , "https://try.gitea.io/api/v1/repos/user12/repo10" , repo . APIURL ( ) )
}
2022-06-15 15:02:00 +08:00
func TestWatchRepo ( t * testing . T ) {
2024-07-30 19:41:10 +00:00
require . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-06-15 15:02:00 +08:00
const repoID = 3
const userID = 2
2024-07-30 19:41:10 +00:00
require . NoError ( t , repo_model . WatchRepo ( db . DefaultContext , userID , repoID , true ) )
2022-06-15 15:02:00 +08:00
unittest . AssertExistsAndLoadBean ( t , & repo_model . Watch { RepoID : repoID , UserID : userID } )
unittest . CheckConsistencyFor ( t , & repo_model . Repository { ID : repoID } )
2024-07-30 19:41:10 +00:00
require . NoError ( t , repo_model . WatchRepo ( db . DefaultContext , userID , repoID , false ) )
2022-06-15 15:02:00 +08:00
unittest . AssertNotExistsBean ( t , & repo_model . Watch { RepoID : repoID , UserID : userID } )
unittest . CheckConsistencyFor ( t , & repo_model . Repository { ID : repoID } )
}
func TestMetas ( t * testing . T ) {
2024-07-30 19:41:10 +00:00
require . NoError ( t , unittest . PrepareTestDatabase ( ) )
2022-06-15 15:02:00 +08:00
repo := & repo_model . Repository { Name : "testRepo" }
repo . Owner = & user_model . User { Name : "testOwner" }
repo . OwnerName = repo . Owner . Name
repo . Units = nil
2023-10-11 06:24:07 +02:00
metas := repo . ComposeMetas ( db . DefaultContext )
2022-06-15 15:02:00 +08:00
assert . Equal ( t , "testRepo" , metas [ "repo" ] )
assert . Equal ( t , "testOwner" , metas [ "user" ] )
externalTracker := repo_model . RepoUnit {
Type : unit . TypeExternalTracker ,
Config : & repo_model . ExternalTrackerConfig {
ExternalTrackerFormat : "https://someurl.com/{user}/{repo}/{issue}" ,
} ,
}
testSuccess := func ( expectedStyle string ) {
repo . Units = [ ] * repo_model . RepoUnit { & externalTracker }
repo . RenderingMetas = nil
2023-10-11 06:24:07 +02:00
metas := repo . ComposeMetas ( db . DefaultContext )
2022-06-15 15:02:00 +08:00
assert . Equal ( t , expectedStyle , metas [ "style" ] )
assert . Equal ( t , "testRepo" , metas [ "repo" ] )
assert . Equal ( t , "testOwner" , metas [ "user" ] )
assert . Equal ( t , "https://someurl.com/{user}/{repo}/{issue}" , metas [ "format" ] )
}
testSuccess ( markup . IssueNameStyleNumeric )
externalTracker . ExternalTrackerConfig ( ) . ExternalTrackerStyle = markup . IssueNameStyleAlphanumeric
testSuccess ( markup . IssueNameStyleAlphanumeric )
externalTracker . ExternalTrackerConfig ( ) . ExternalTrackerStyle = markup . IssueNameStyleNumeric
testSuccess ( markup . IssueNameStyleNumeric )
externalTracker . ExternalTrackerConfig ( ) . ExternalTrackerStyle = markup . IssueNameStyleRegexp
testSuccess ( markup . IssueNameStyleRegexp )
2022-12-03 10:48:26 +08:00
repo , err := repo_model . GetRepositoryByID ( db . DefaultContext , 3 )
2024-07-30 19:41:10 +00:00
require . NoError ( t , err )
2022-06-15 15:02:00 +08:00
2023-10-11 06:24:07 +02:00
metas = repo . ComposeMetas ( db . DefaultContext )
2022-06-15 15:02:00 +08:00
assert . Contains ( t , metas , "org" )
assert . Contains ( t , metas , "teams" )
2023-09-14 10:59:53 +08:00
assert . Equal ( t , "org3" , metas [ "org" ] )
2022-06-15 15:02:00 +08:00
assert . Equal ( t , ",owners,team1," , metas [ "teams" ] )
}
2023-03-28 19:55:03 +02:00
func TestGetRepositoryByURL ( t * testing . T ) {
2024-07-30 19:41:10 +00:00
require . NoError ( t , unittest . PrepareTestDatabase ( ) )
2023-03-28 19:55:03 +02:00
t . Run ( "InvalidPath" , func ( t * testing . T ) {
repo , err := repo_model . GetRepositoryByURL ( db . DefaultContext , "something" )
assert . Nil ( t , repo )
2024-07-30 19:41:10 +00:00
require . Error ( t , err )
2023-03-28 19:55:03 +02:00
} )
t . Run ( "ValidHttpURL" , func ( t * testing . T ) {
test := func ( t * testing . T , url string ) {
repo , err := repo_model . GetRepositoryByURL ( db . DefaultContext , url )
assert . NotNil ( t , repo )
2024-07-30 19:41:10 +00:00
require . NoError ( t , err )
2023-03-28 19:55:03 +02:00
2024-07-30 19:41:10 +00:00
assert . Equal ( t , int64 ( 2 ) , repo . ID )
assert . Equal ( t , int64 ( 2 ) , repo . OwnerID )
2023-03-28 19:55:03 +02:00
}
test ( t , "https://try.gitea.io/user2/repo2" )
test ( t , "https://try.gitea.io/user2/repo2.git" )
} )
t . Run ( "ValidGitSshURL" , func ( t * testing . T ) {
test := func ( t * testing . T , url string ) {
repo , err := repo_model . GetRepositoryByURL ( db . DefaultContext , url )
assert . NotNil ( t , repo )
2024-07-30 19:41:10 +00:00
require . NoError ( t , err )
2023-03-28 19:55:03 +02:00
2024-07-30 19:41:10 +00:00
assert . Equal ( t , int64 ( 2 ) , repo . ID )
assert . Equal ( t , int64 ( 2 ) , repo . OwnerID )
2023-03-28 19:55:03 +02:00
}
test ( t , "git+ssh://sshuser@try.gitea.io/user2/repo2" )
test ( t , "git+ssh://sshuser@try.gitea.io/user2/repo2.git" )
test ( t , "git+ssh://try.gitea.io/user2/repo2" )
test ( t , "git+ssh://try.gitea.io/user2/repo2.git" )
} )
t . Run ( "ValidImplicitSshURL" , func ( t * testing . T ) {
test := func ( t * testing . T , url string ) {
repo , err := repo_model . GetRepositoryByURL ( db . DefaultContext , url )
assert . NotNil ( t , repo )
2024-07-30 19:41:10 +00:00
require . NoError ( t , err )
2023-03-28 19:55:03 +02:00
2024-07-30 19:41:10 +00:00
assert . Equal ( t , int64 ( 2 ) , repo . ID )
assert . Equal ( t , int64 ( 2 ) , repo . OwnerID )
2023-03-28 19:55:03 +02:00
}
test ( t , "sshuser@try.gitea.io:user2/repo2" )
test ( t , "sshuser@try.gitea.io:user2/repo2.git" )
test ( t , "try.gitea.io:user2/repo2" )
test ( t , "try.gitea.io:user2/repo2.git" )
} )
}
2023-12-15 14:18:12 +08:00
func TestComposeSSHCloneURL ( t * testing . T ) {
defer test . MockVariableValue ( & setting . SSH , setting . SSH ) ( )
defer test . MockVariableValue ( & setting . Repository , setting . Repository ) ( )
setting . SSH . User = "git"
// test SSH_DOMAIN
setting . SSH . Domain = "domain"
setting . SSH . Port = 22
setting . Repository . UseCompatSSHURI = false
assert . Equal ( t , "git@domain:user/repo.git" , repo_model . ComposeSSHCloneURL ( "user" , "repo" ) )
setting . Repository . UseCompatSSHURI = true
assert . Equal ( t , "ssh://git@domain/user/repo.git" , repo_model . ComposeSSHCloneURL ( "user" , "repo" ) )
// test SSH_DOMAIN while use non-standard SSH port
setting . SSH . Port = 123
setting . Repository . UseCompatSSHURI = false
assert . Equal ( t , "ssh://git@domain:123/user/repo.git" , repo_model . ComposeSSHCloneURL ( "user" , "repo" ) )
setting . Repository . UseCompatSSHURI = true
assert . Equal ( t , "ssh://git@domain:123/user/repo.git" , repo_model . ComposeSSHCloneURL ( "user" , "repo" ) )
// test IPv6 SSH_DOMAIN
setting . Repository . UseCompatSSHURI = false
setting . SSH . Domain = "::1"
setting . SSH . Port = 22
assert . Equal ( t , "git@[::1]:user/repo.git" , repo_model . ComposeSSHCloneURL ( "user" , "repo" ) )
setting . SSH . Port = 123
assert . Equal ( t , "ssh://git@[::1]:123/user/repo.git" , repo_model . ComposeSSHCloneURL ( "user" , "repo" ) )
}
2024-05-24 13:28:15 +02:00
func TestAPActorID ( t * testing . T ) {
repo := repo_model . Repository { ID : 1 }
url := repo . APActorID ( )
expected := "https://try.gitea.io/api/v1/activitypub/repository-id/1"
if url != expected {
t . Errorf ( "unexpected APActorID, expected: %q, actual: %q" , expected , url )
}
}