2017-06-30 19:50: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-06-30 19:50:57 +03:00
import (
2018-08-13 22:04:39 +03:00
"fmt"
2017-06-30 19:50:57 +03:00
"net/http"
"testing"
2022-06-13 12:37:59 +03:00
issues_model "code.gitea.io/gitea/models/issues"
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"
2018-08-13 22:04:39 +03:00
"code.gitea.io/gitea/modules/setting"
2019-05-11 13:21:34 +03:00
api "code.gitea.io/gitea/modules/structs"
2021-04-06 22:44:05 +03:00
"code.gitea.io/gitea/services/forms"
2019-10-11 09:44:43 +03:00
issue_service "code.gitea.io/gitea/services/issue"
2022-09-02 22:18:23 +03:00
"code.gitea.io/gitea/tests"
2017-06-30 19:50:57 +03:00
"github.com/stretchr/testify/assert"
)
func TestAPIViewPulls ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
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 } )
2017-06-30 19:50:57 +03:00
session := loginUser ( t , "user2" )
2018-09-10 19:15:52 +03:00
token := getTokenForLoggedInUser ( t , session )
req := NewRequestf ( t , "GET" , "/api/v1/repos/%s/%s/pulls?state=all&token=" + token , owner . Name , repo . Name )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-30 19:50:57 +03:00
var pulls [ ] * api . PullRequest
DecodeJSON ( t , resp , & pulls )
2022-06-13 12:37:59 +03:00
expectedLen := unittest . GetCount ( t , & issues_model . Issue { RepoID : repo . ID } , unittest . Cond ( "is_pull = ?" , true ) )
2017-06-30 19:50:57 +03:00
assert . Len ( t , pulls , expectedLen )
}
2018-08-13 22:04:39 +03:00
// TestAPIMergePullWIP ensures that we can't merge a WIP pull request
func TestAPIMergePullWIP ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
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 } )
pr := unittest . AssertExistsAndLoadBean ( t , & issues_model . PullRequest { Status : issues_model . PullRequestStatusMergeable } , unittest . Cond ( "has_merged = ?" , false ) )
2018-08-13 22:04:39 +03:00
pr . LoadIssue ( )
2019-10-11 09:44:43 +03:00
issue_service . ChangeTitle ( pr . Issue , owner , setting . Repository . PullRequest . WorkInProgressPrefixes [ 0 ] + " " + pr . Issue . Title )
2018-08-13 22:04:39 +03:00
// force reload
pr . LoadAttributes ( )
assert . Contains ( t , pr . Issue . Title , setting . Repository . PullRequest . WorkInProgressPrefixes [ 0 ] )
session := loginUser ( t , owner . Name )
2018-09-10 19:15:52 +03:00
token := getTokenForLoggedInUser ( t , session )
2021-04-06 22:44:05 +03:00
req := NewRequestWithJSON ( t , http . MethodPost , fmt . Sprintf ( "/api/v1/repos/%s/%s/pulls/%d/merge?token=%s" , owner . Name , repo . Name , pr . Index , token ) , & forms . MergePullRequestForm {
2018-08-13 22:04:39 +03:00
MergeMessageField : pr . Issue . Title ,
2021-12-10 04:27:50 +03:00
Do : string ( repo_model . MergeStyleMerge ) ,
2018-08-13 22:04:39 +03:00
} )
session . MakeRequest ( t , req , http . StatusMethodNotAllowed )
}
2019-05-07 20:20:23 +03:00
2020-06-07 22:13:40 +03:00
func TestAPICreatePullSuccess ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2022-08-16 05:22:25 +03:00
repo10 := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 10 } )
2019-05-07 20:20:23 +03:00
// repo10 have code, pulls units.
2022-08-16 05:22:25 +03:00
repo11 := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 11 } )
2019-05-07 20:20:23 +03:00
// repo11 only have code unit but should still create pulls
2022-08-16 05:22:25 +03:00
owner10 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo10 . OwnerID } )
owner11 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo11 . OwnerID } )
2019-05-07 20:20:23 +03:00
session := loginUser ( t , owner11 . Name )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestWithJSON ( t , http . MethodPost , fmt . Sprintf ( "/api/v1/repos/%s/%s/pulls?token=%s" , owner10 . Name , repo10 . Name , token ) , & api . CreatePullRequestOption {
Head : fmt . Sprintf ( "%s:master" , owner11 . Name ) ,
Base : "master" ,
Title : "create a failure pr" ,
} )
2022-03-23 07:54:07 +03:00
session . MakeRequest ( t , req , http . StatusCreated )
2021-03-13 21:06:52 +03:00
session . MakeRequest ( t , req , http . StatusUnprocessableEntity ) // second request should fail
}
func TestAPICreatePullWithFieldsSuccess ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2021-03-13 21:06:52 +03:00
// repo10 have code, pulls units.
2022-08-16 05:22:25 +03:00
repo10 := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 10 } )
owner10 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo10 . OwnerID } )
2021-03-13 21:06:52 +03:00
// repo11 only have code unit but should still create pulls
2022-08-16 05:22:25 +03:00
repo11 := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 11 } )
owner11 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo11 . OwnerID } )
2021-03-13 21:06:52 +03:00
session := loginUser ( t , owner11 . Name )
token := getTokenForLoggedInUser ( t , session )
opts := & api . CreatePullRequestOption {
Head : fmt . Sprintf ( "%s:master" , owner11 . Name ) ,
Base : "master" ,
Title : "create a failure pr" ,
Body : "foobaaar" ,
Milestone : 5 ,
Assignees : [ ] string { owner10 . Name } ,
Labels : [ ] int64 { 5 } ,
}
req := NewRequestWithJSON ( t , http . MethodPost , fmt . Sprintf ( "/api/v1/repos/%s/%s/pulls?token=%s" , owner10 . Name , repo10 . Name , token ) , opts )
2022-03-23 07:54:07 +03:00
res := session . MakeRequest ( t , req , http . StatusCreated )
2021-03-13 21:06:52 +03:00
pull := new ( api . PullRequest )
DecodeJSON ( t , res , pull )
assert . NotNil ( t , pull . Milestone )
assert . EqualValues ( t , opts . Milestone , pull . Milestone . ID )
if assert . Len ( t , pull . Assignees , 1 ) {
assert . EqualValues ( t , opts . Assignees [ 0 ] , owner10 . Name )
}
assert . NotNil ( t , pull . Labels )
assert . EqualValues ( t , opts . Labels [ 0 ] , pull . Labels [ 0 ] . ID )
}
func TestAPICreatePullWithFieldsFailure ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2021-03-13 21:06:52 +03:00
// repo10 have code, pulls units.
2022-08-16 05:22:25 +03:00
repo10 := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 10 } )
owner10 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo10 . OwnerID } )
2021-03-13 21:06:52 +03:00
// repo11 only have code unit but should still create pulls
2022-08-16 05:22:25 +03:00
repo11 := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 11 } )
owner11 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo11 . OwnerID } )
2021-03-13 21:06:52 +03:00
session := loginUser ( t , owner11 . Name )
token := getTokenForLoggedInUser ( t , session )
opts := & api . CreatePullRequestOption {
Head : fmt . Sprintf ( "%s:master" , owner11 . Name ) ,
Base : "master" ,
}
req := NewRequestWithJSON ( t , http . MethodPost , fmt . Sprintf ( "/api/v1/repos/%s/%s/pulls?token=%s" , owner10 . Name , repo10 . Name , token ) , opts )
session . MakeRequest ( t , req , http . StatusUnprocessableEntity )
opts . Title = "is required"
opts . Milestone = 666
session . MakeRequest ( t , req , http . StatusUnprocessableEntity )
opts . Milestone = 5
opts . Assignees = [ ] string { "qweruqweroiuyqweoiruywqer" }
session . MakeRequest ( t , req , http . StatusUnprocessableEntity )
opts . Assignees = [ ] string { owner10 . LoginName }
opts . Labels = [ ] int64 { 55555 }
session . MakeRequest ( t , req , http . StatusUnprocessableEntity )
opts . Labels = [ ] int64 { 5 }
2019-05-07 20:20:23 +03:00
}
2020-06-07 22:13:40 +03:00
func TestAPIEditPull ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2022-08-16 05:22:25 +03:00
repo10 := unittest . AssertExistsAndLoadBean ( t , & repo_model . Repository { ID : 10 } )
owner10 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : repo10 . OwnerID } )
2019-05-07 20:20:23 +03:00
session := loginUser ( t , owner10 . Name )
token := getTokenForLoggedInUser ( t , session )
req := NewRequestWithJSON ( t , http . MethodPost , fmt . Sprintf ( "/api/v1/repos/%s/%s/pulls?token=%s" , owner10 . Name , repo10 . Name , token ) , & api . CreatePullRequestOption {
Head : "develop" ,
Base : "master" ,
Title : "create a success pr" ,
} )
2020-06-07 22:13:40 +03:00
pull := new ( api . PullRequest )
2022-03-23 07:54:07 +03:00
resp := session . MakeRequest ( t , req , http . StatusCreated )
2020-06-07 22:13:40 +03:00
DecodeJSON ( t , resp , pull )
assert . EqualValues ( t , "master" , pull . Base . Name )
req = NewRequestWithJSON ( t , http . MethodPatch , fmt . Sprintf ( "/api/v1/repos/%s/%s/pulls/%d?token=%s" , owner10 . Name , repo10 . Name , pull . Index , token ) , & api . EditPullRequestOption {
Base : "feature/1" ,
Title : "edit a this pr" ,
} )
2022-03-23 07:54:07 +03:00
resp = session . MakeRequest ( t , req , http . StatusCreated )
2020-06-07 22:13:40 +03:00
DecodeJSON ( t , resp , pull )
assert . EqualValues ( t , "feature/1" , pull . Base . Name )
2019-05-07 20:20:23 +03:00
2020-06-07 22:13:40 +03:00
req = NewRequestWithJSON ( t , http . MethodPatch , fmt . Sprintf ( "/api/v1/repos/%s/%s/pulls/%d?token=%s" , owner10 . Name , repo10 . Name , pull . Index , token ) , & api . EditPullRequestOption {
Base : "not-exist" ,
} )
2022-03-23 07:54:07 +03:00
session . MakeRequest ( t , req , http . StatusNotFound )
2019-05-07 20:20:23 +03:00
}