2017-07-02 05:03:57 +03:00
// Copyright 2017 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.
2022-09-02 22:18:23 +03:00
package integration
2017-07-02 05:03:57 +03:00
import (
"net/http"
2020-05-29 21:16:20 +03:00
"net/url"
2017-07-02 05:03:57 +03:00
"testing"
2019-05-11 13:21:34 +03:00
api "code.gitea.io/gitea/modules/structs"
2022-09-02 22:18:23 +03:00
"code.gitea.io/gitea/tests"
2017-07-02 05:03:57 +03:00
"github.com/stretchr/testify/assert"
)
func testAPIGetBranch ( t * testing . T , branchName string , exists bool ) {
session := loginUser ( t , "user2" )
2018-09-10 19:15:52 +03:00
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/user2/repo1/branches/%s?token=%s" , branchName , token )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , NoExpectedStatus )
2017-07-02 05:03:57 +03:00
if ! exists {
2017-12-04 01:46:01 +03:00
assert . EqualValues ( t , http . StatusNotFound , resp . Code )
2017-07-02 05:03:57 +03:00
return
}
2017-12-04 01:46:01 +03:00
assert . EqualValues ( t , http . StatusOK , resp . Code )
2017-07-02 05:03:57 +03:00
var branch api . Branch
DecodeJSON ( t , resp , & branch )
assert . EqualValues ( t , branchName , branch . Name )
2020-03-21 06:41:33 +03:00
assert . True ( t , branch . UserCanPush )
assert . True ( t , branch . UserCanMerge )
2017-07-02 05:03:57 +03:00
}
2020-02-13 02:19:35 +03:00
func testAPIGetBranchProtection ( t * testing . T , branchName string , expectedHTTPStatus int ) {
session := loginUser ( t , "user2" )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/user2/repo1/branch_protections/%s?token=%s" , branchName , token )
resp := session . MakeRequest ( t , req , expectedHTTPStatus )
2022-03-23 07:54:07 +03:00
if resp . Code == http . StatusOK {
2020-02-13 02:19:35 +03:00
var branchProtection api . BranchProtection
DecodeJSON ( t , resp , & branchProtection )
assert . EqualValues ( t , branchName , branchProtection . BranchName )
}
}
func testAPICreateBranchProtection ( t * testing . T , branchName string , expectedHTTPStatus int ) {
session := loginUser ( t , "user2" )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestWithJSON ( t , "POST" , "/api/v1/repos/user2/repo1/branch_protections?token=" + token , & api . BranchProtection {
BranchName : branchName ,
} )
resp := session . MakeRequest ( t , req , expectedHTTPStatus )
2022-03-23 07:54:07 +03:00
if resp . Code == http . StatusCreated {
2020-02-13 02:19:35 +03:00
var branchProtection api . BranchProtection
DecodeJSON ( t , resp , & branchProtection )
assert . EqualValues ( t , branchName , branchProtection . BranchName )
}
}
func testAPIEditBranchProtection ( t * testing . T , branchName string , body * api . BranchProtection , expectedHTTPStatus int ) {
session := loginUser ( t , "user2" )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestWithJSON ( t , "PATCH" , "/api/v1/repos/user2/repo1/branch_protections/" + branchName + "?token=" + token , body )
resp := session . MakeRequest ( t , req , expectedHTTPStatus )
2022-03-23 07:54:07 +03:00
if resp . Code == http . StatusOK {
2020-02-13 02:19:35 +03:00
var branchProtection api . BranchProtection
DecodeJSON ( t , resp , & branchProtection )
assert . EqualValues ( t , branchName , branchProtection . BranchName )
}
}
func testAPIDeleteBranchProtection ( t * testing . T , branchName string , expectedHTTPStatus int ) {
session := loginUser ( t , "user2" )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "DELETE" , "/api/v1/repos/user2/repo1/branch_protections/%s?token=%s" , branchName , token )
session . MakeRequest ( t , req , expectedHTTPStatus )
}
2020-04-19 05:38:09 +03:00
func testAPIDeleteBranch ( t * testing . T , branchName string , expectedHTTPStatus int ) {
session := loginUser ( t , "user2" )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "DELETE" , "/api/v1/repos/user2/repo1/branches/%s?token=%s" , branchName , token )
session . MakeRequest ( t , req , expectedHTTPStatus )
}
2017-07-02 05:03:57 +03:00
func TestAPIGetBranch ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2017-07-02 05:03:57 +03:00
for _ , test := range [ ] struct {
BranchName string
Exists bool
} {
{ "master" , true } ,
{ "master/doesnotexist" , false } ,
{ "feature/1" , true } ,
{ "feature/1/doesnotexist" , false } ,
} {
testAPIGetBranch ( t , test . BranchName , test . Exists )
}
}
2020-02-13 02:19:35 +03:00
2020-05-29 21:16:20 +03:00
func TestAPICreateBranch ( t * testing . T ) {
onGiteaRun ( t , testAPICreateBranches )
}
func testAPICreateBranches ( t * testing . T , giteaURL * url . URL ) {
username := "user2"
ctx := NewAPITestContext ( t , username , "my-noo-repo" )
giteaURL . Path = ctx . GitPath ( )
t . Run ( "CreateRepo" , doAPICreateRepository ( ctx , false ) )
2022-09-02 22:18:23 +03:00
testCases := [ ] struct {
2020-05-29 21:16:20 +03:00
OldBranch string
NewBranch string
ExpectedHTTPStatus int
} {
// Creating branch from default branch
{
OldBranch : "" ,
NewBranch : "new_branch_from_default_branch" ,
ExpectedHTTPStatus : http . StatusCreated ,
} ,
// Creating branch from master
{
OldBranch : "master" ,
NewBranch : "new_branch_from_master_1" ,
ExpectedHTTPStatus : http . StatusCreated ,
} ,
// Trying to create from master but already exists
{
OldBranch : "master" ,
NewBranch : "new_branch_from_master_1" ,
ExpectedHTTPStatus : http . StatusConflict ,
} ,
// Trying to create from other branch (not default branch)
{
OldBranch : "new_branch_from_master_1" ,
NewBranch : "branch_2" ,
ExpectedHTTPStatus : http . StatusCreated ,
} ,
// Trying to create from a branch which does not exist
{
OldBranch : "does_not_exist" ,
NewBranch : "new_branch_from_non_existent" ,
ExpectedHTTPStatus : http . StatusNotFound ,
} ,
}
2022-09-02 22:18:23 +03:00
for _ , test := range testCases {
defer tests . ResetFixtures ( t )
2020-05-29 21:16:20 +03:00
session := ctx . Session
2021-04-16 21:30:16 +03:00
testAPICreateBranch ( t , session , "user2" , "my-noo-repo" , test . OldBranch , test . NewBranch , test . ExpectedHTTPStatus )
2020-05-29 21:16:20 +03:00
}
}
2021-04-16 21:30:16 +03:00
func testAPICreateBranch ( t testing . TB , session * TestSession , user , repo , oldBranch , newBranch string , status int ) bool {
token := getTokenForLoggedInUser ( t , session )
req := NewRequestWithJSON ( t , "POST" , "/api/v1/repos/" + user + "/" + repo + "/branches?token=" + token , & api . CreateBranchRepoOption {
BranchName : newBranch ,
OldBranchName : oldBranch ,
} )
resp := session . MakeRequest ( t , req , status )
var branch api . Branch
DecodeJSON ( t , resp , & branch )
if status == http . StatusCreated {
assert . EqualValues ( t , newBranch , branch . Name )
}
return resp . Result ( ) . StatusCode == status
}
2020-02-13 02:19:35 +03:00
func TestAPIBranchProtection ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2020-02-13 02:19:35 +03:00
// Branch protection only on branch that exist
testAPICreateBranchProtection ( t , "master/doesnotexist" , http . StatusNotFound )
// Get branch protection on branch that exist but not branch protection
testAPIGetBranchProtection ( t , "master" , http . StatusNotFound )
testAPICreateBranchProtection ( t , "master" , http . StatusCreated )
// Can only create once
testAPICreateBranchProtection ( t , "master" , http . StatusForbidden )
2020-04-19 05:38:09 +03:00
// Can't delete a protected branch
testAPIDeleteBranch ( t , "master" , http . StatusForbidden )
2020-02-13 02:19:35 +03:00
testAPIGetBranchProtection ( t , "master" , http . StatusOK )
testAPIEditBranchProtection ( t , "master" , & api . BranchProtection {
EnablePush : true ,
} , http . StatusOK )
testAPIDeleteBranchProtection ( t , "master" , http . StatusNoContent )
2020-04-19 05:38:09 +03:00
// Test branch deletion
testAPIDeleteBranch ( t , "master" , http . StatusForbidden )
testAPIDeleteBranch ( t , "branch2" , http . StatusNoContent )
2020-02-13 02:19:35 +03:00
}