2019-04-17 08:31:08 +03:00
// Copyright 2019 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.
package integrations
import (
"fmt"
"net/http"
"testing"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-16 11:53:21 +03:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2019-05-11 13:21:34 +03:00
api "code.gitea.io/gitea/modules/structs"
2019-04-17 08:31:08 +03:00
"github.com/stretchr/testify/assert"
)
const testHookContent = ` # ! / bin / bash
echo Hello , World !
`
func TestAPIListGitHooks ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2019-04-17 08:31:08 +03:00
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 37 } )
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2019-04-17 08:31:08 +03:00
// user1 is an admin user
session := loginUser ( t , "user1" )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/hooks/git?token=%s" ,
owner . Name , repo . Name , token )
resp := MakeRequest ( t , req , http . StatusOK )
var apiGitHooks [ ] * api . GitHook
DecodeJSON ( t , resp , & apiGitHooks )
assert . Len ( t , apiGitHooks , 3 )
for _ , apiGitHook := range apiGitHooks {
if apiGitHook . Name == "pre-receive" {
assert . True ( t , apiGitHook . IsActive )
assert . Equal ( t , testHookContent , apiGitHook . Content )
} else {
assert . False ( t , apiGitHook . IsActive )
assert . Empty ( t , apiGitHook . Content )
}
}
}
func TestAPIListGitHooksNoHooks ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2019-04-17 08:31:08 +03:00
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2019-04-17 08:31:08 +03:00
// user1 is an admin user
session := loginUser ( t , "user1" )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/hooks/git?token=%s" ,
owner . Name , repo . Name , token )
resp := MakeRequest ( t , req , http . StatusOK )
var apiGitHooks [ ] * api . GitHook
DecodeJSON ( t , resp , & apiGitHooks )
assert . Len ( t , apiGitHooks , 3 )
for _ , apiGitHook := range apiGitHooks {
assert . False ( t , apiGitHook . IsActive )
assert . Empty ( t , apiGitHook . Content )
}
}
func TestAPIListGitHooksNoAccess ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2019-04-17 08:31:08 +03:00
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2019-04-17 08:31:08 +03:00
session := loginUser ( t , owner . Name )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/hooks/git?token=%s" ,
owner . Name , repo . Name , token )
MakeRequest ( t , req , http . StatusForbidden )
}
func TestAPIGetGitHook ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2019-04-17 08:31:08 +03:00
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 37 } )
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2019-04-17 08:31:08 +03:00
// user1 is an admin user
session := loginUser ( t , "user1" )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s" ,
owner . Name , repo . Name , token )
resp := MakeRequest ( t , req , http . StatusOK )
var apiGitHook * api . GitHook
DecodeJSON ( t , resp , & apiGitHook )
assert . True ( t , apiGitHook . IsActive )
assert . Equal ( t , testHookContent , apiGitHook . Content )
}
func TestAPIGetGitHookNoAccess ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2019-04-17 08:31:08 +03:00
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2019-04-17 08:31:08 +03:00
session := loginUser ( t , owner . Name )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s" ,
owner . Name , repo . Name , token )
MakeRequest ( t , req , http . StatusForbidden )
}
func TestAPIEditGitHook ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2019-04-17 08:31:08 +03:00
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2019-04-17 08:31:08 +03:00
// user1 is an admin user
session := loginUser ( t , "user1" )
token := getTokenForLoggedInUser ( t , session )
urlStr := fmt . Sprintf ( "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s" ,
owner . Name , repo . Name , token )
req := NewRequestWithJSON ( t , "PATCH" , urlStr , & api . EditGitHookOption {
Content : testHookContent ,
} )
resp := MakeRequest ( t , req , http . StatusOK )
var apiGitHook * api . GitHook
DecodeJSON ( t , resp , & apiGitHook )
assert . True ( t , apiGitHook . IsActive )
assert . Equal ( t , testHookContent , apiGitHook . Content )
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s" ,
owner . Name , repo . Name , token )
resp = MakeRequest ( t , req , http . StatusOK )
var apiGitHook2 * api . GitHook
DecodeJSON ( t , resp , & apiGitHook2 )
assert . True ( t , apiGitHook2 . IsActive )
assert . Equal ( t , testHookContent , apiGitHook2 . Content )
}
func TestAPIEditGitHookNoAccess ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2019-04-17 08:31:08 +03:00
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2019-04-17 08:31:08 +03:00
session := loginUser ( t , owner . Name )
token := getTokenForLoggedInUser ( t , session )
urlStr := fmt . Sprintf ( "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s" ,
owner . Name , repo . Name , token )
req := NewRequestWithJSON ( t , "PATCH" , urlStr , & api . EditGitHookOption {
Content : testHookContent ,
} )
MakeRequest ( t , req , http . StatusForbidden )
}
func TestAPIDeleteGitHook ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2019-04-17 08:31:08 +03:00
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 37 } )
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2019-04-17 08:31:08 +03:00
// user1 is an admin user
session := loginUser ( t , "user1" )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "DELETE" , "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s" ,
owner . Name , repo . Name , token )
MakeRequest ( t , req , http . StatusNoContent )
req = NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s" ,
owner . Name , repo . Name , token )
resp := MakeRequest ( t , req , http . StatusOK )
var apiGitHook2 * api . GitHook
DecodeJSON ( t , resp , & apiGitHook2 )
assert . False ( t , apiGitHook2 . IsActive )
assert . Empty ( t , apiGitHook2 . Content )
}
func TestAPIDeleteGitHookNoAccess ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2019-04-17 08:31:08 +03:00
2022-08-16 05:22:25 +03:00
repo := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 1 } )
owner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo . OwnerID } )
2019-04-17 08:31:08 +03:00
session := loginUser ( t , owner . Name )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "DELETE" , "/api/v1/repos/%s/%s/hooks/git/pre-receive?token=%s" ,
owner . Name , repo . Name , token )
MakeRequest ( t , req , http . StatusForbidden )
}