2017-06-15 14:20:39 +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.
package integrations
import (
"net/http"
2017-12-04 01:46:01 +03:00
"net/http/httptest"
2017-06-15 14:20:39 +03:00
"path"
"strings"
"testing"
2018-01-05 21:56:50 +03:00
"code.gitea.io/gitea/models"
2017-12-16 00:11:02 +03:00
"code.gitea.io/gitea/modules/test"
2018-08-13 22:04:39 +03:00
"github.com/Unknwon/i18n"
2017-06-15 14:20:39 +03:00
"github.com/stretchr/testify/assert"
)
2018-01-05 21:56:50 +03:00
func testPullMerge ( t * testing . T , session * TestSession , user , repo , pullnum string , mergeStyle models . MergeStyle ) * httptest . ResponseRecorder {
2017-06-15 14:20:39 +03:00
req := NewRequest ( t , "GET" , path . Join ( user , repo , "pulls" , pullnum ) )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-15 14:20:39 +03:00
2017-07-07 22:36:47 +03:00
// Click the little green button to create a pull
2017-06-17 19:29:59 +03:00
htmlDoc := NewHTMLParser ( t , resp . Body )
2018-01-05 21:56:50 +03:00
link , exists := htmlDoc . doc . Find ( ".ui.form." + string ( mergeStyle ) + "-fields > form" ) . Attr ( "action" )
2017-06-15 14:20:39 +03:00
assert . True ( t , exists , "The template has changed" )
2017-06-17 07:49:45 +03:00
req = NewRequestWithValues ( t , "POST" , link , map [ string ] string {
"_csrf" : htmlDoc . GetCSRF ( ) ,
2018-01-05 21:56:50 +03:00
"do" : string ( mergeStyle ) ,
2017-06-17 07:49:45 +03:00
} )
2017-07-07 22:36:47 +03:00
resp = session . MakeRequest ( t , req , http . StatusFound )
2017-06-15 14:20:39 +03:00
return resp
}
2017-12-04 01:46:01 +03:00
func testPullCleanUp ( t * testing . T , session * TestSession , user , repo , pullnum string ) * httptest . ResponseRecorder {
2017-06-21 04:00:03 +03:00
req := NewRequest ( t , "GET" , path . Join ( user , repo , "pulls" , pullnum ) )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-21 04:00:03 +03:00
2017-07-07 22:36:47 +03:00
// Click the little green button to create a pull
2017-06-21 04:00:03 +03:00
htmlDoc := NewHTMLParser ( t , resp . Body )
link , exists := htmlDoc . doc . Find ( ".comments .merge .delete-button" ) . Attr ( "data-url" )
assert . True ( t , exists , "The template has changed" )
req = NewRequestWithValues ( t , "POST" , link , map [ string ] string {
"_csrf" : htmlDoc . GetCSRF ( ) ,
} )
2017-07-07 22:36:47 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
2017-06-21 04:00:03 +03:00
return resp
}
2017-06-15 14:20:39 +03:00
func TestPullMerge ( t * testing . T ) {
prepareTestEnv ( t )
2017-06-17 07:49:45 +03:00
session := loginUser ( t , "user1" )
2017-10-15 18:06:07 +03:00
testRepoFork ( t , session , "user2" , "repo1" , "user1" , "repo1" )
2017-10-16 00:54:53 +03:00
testEditFile ( t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n" )
2017-06-15 14:20:39 +03:00
2018-02-18 23:06:37 +03:00
resp := testPullCreate ( t , session , "user1" , "repo1" , "master" , "This is a pull title" )
2017-06-15 14:20:39 +03:00
2017-12-16 00:11:02 +03:00
elem := strings . Split ( test . RedirectURL ( resp ) , "/" )
2017-06-15 14:20:39 +03:00
assert . EqualValues ( t , "pulls" , elem [ 3 ] )
2018-01-05 21:56:50 +03:00
testPullMerge ( t , session , elem [ 1 ] , elem [ 2 ] , elem [ 4 ] , models . MergeStyleMerge )
}
func TestPullRebase ( t * testing . T ) {
prepareTestEnv ( t )
session := loginUser ( t , "user1" )
testRepoFork ( t , session , "user2" , "repo1" , "user1" , "repo1" )
testEditFile ( t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n" )
2018-02-18 23:06:37 +03:00
resp := testPullCreate ( t , session , "user1" , "repo1" , "master" , "This is a pull title" )
2018-01-05 21:56:50 +03:00
elem := strings . Split ( test . RedirectURL ( resp ) , "/" )
assert . EqualValues ( t , "pulls" , elem [ 3 ] )
testPullMerge ( t , session , elem [ 1 ] , elem [ 2 ] , elem [ 4 ] , models . MergeStyleRebase )
}
2018-12-27 13:27:08 +03:00
func TestPullRebaseMerge ( t * testing . T ) {
prepareTestEnv ( t )
session := loginUser ( t , "user1" )
testRepoFork ( t , session , "user2" , "repo1" , "user1" , "repo1" )
testEditFile ( t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n" )
resp := testPullCreate ( t , session , "user1" , "repo1" , "master" , "This is a pull title" )
elem := strings . Split ( test . RedirectURL ( resp ) , "/" )
assert . EqualValues ( t , "pulls" , elem [ 3 ] )
testPullMerge ( t , session , elem [ 1 ] , elem [ 2 ] , elem [ 4 ] , models . MergeStyleRebaseMerge )
}
2018-01-05 21:56:50 +03:00
func TestPullSquash ( t * testing . T ) {
prepareTestEnv ( t )
session := loginUser ( t , "user1" )
testRepoFork ( t , session , "user2" , "repo1" , "user1" , "repo1" )
testEditFile ( t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n" )
testEditFile ( t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited!)\n" )
2018-02-18 23:06:37 +03:00
resp := testPullCreate ( t , session , "user1" , "repo1" , "master" , "This is a pull title" )
2018-01-05 21:56:50 +03:00
elem := strings . Split ( test . RedirectURL ( resp ) , "/" )
assert . EqualValues ( t , "pulls" , elem [ 3 ] )
testPullMerge ( t , session , elem [ 1 ] , elem [ 2 ] , elem [ 4 ] , models . MergeStyleSquash )
2017-06-15 14:20:39 +03:00
}
2017-06-21 04:00:03 +03:00
func TestPullCleanUpAfterMerge ( t * testing . T ) {
prepareTestEnv ( t )
session := loginUser ( t , "user1" )
2017-10-15 18:06:07 +03:00
testRepoFork ( t , session , "user2" , "repo1" , "user1" , "repo1" )
2017-10-16 00:54:53 +03:00
testEditFileToNewBranch ( t , session , "user1" , "repo1" , "master" , "feature/test" , "README.md" , "Hello, World (Edited)\n" )
2017-06-21 04:00:03 +03:00
2018-02-18 23:06:37 +03:00
resp := testPullCreate ( t , session , "user1" , "repo1" , "feature/test" , "This is a pull title" )
2017-06-21 04:00:03 +03:00
2017-12-16 00:11:02 +03:00
elem := strings . Split ( test . RedirectURL ( resp ) , "/" )
2017-06-21 04:00:03 +03:00
assert . EqualValues ( t , "pulls" , elem [ 3 ] )
2018-01-05 21:56:50 +03:00
testPullMerge ( t , session , elem [ 1 ] , elem [ 2 ] , elem [ 4 ] , models . MergeStyleMerge )
2017-06-21 04:00:03 +03:00
// Check PR branch deletion
resp = testPullCleanUp ( t , session , elem [ 1 ] , elem [ 2 ] , elem [ 4 ] )
respJSON := struct {
Redirect string
} { }
DecodeJSON ( t , resp , & respJSON )
assert . NotEmpty ( t , respJSON . Redirect , "Redirected URL is not found" )
elem = strings . Split ( respJSON . Redirect , "/" )
assert . EqualValues ( t , "pulls" , elem [ 3 ] )
// Check branch deletion result
req := NewRequest ( t , "GET" , respJSON . Redirect )
2017-07-07 22:36:47 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
2017-06-21 04:00:03 +03:00
htmlDoc := NewHTMLParser ( t , resp . Body )
resultMsg := htmlDoc . doc . Find ( ".ui.message>p" ) . Text ( )
2018-04-19 17:24:31 +03:00
assert . EqualValues ( t , "Branch 'user1/feature/test' has been deleted." , resultMsg )
2017-06-21 04:00:03 +03:00
}
2018-08-13 22:04:39 +03:00
func TestCantMergeWorkInProgress ( t * testing . T ) {
prepareTestEnv ( t )
session := loginUser ( t , "user1" )
testRepoFork ( t , session , "user2" , "repo1" , "user1" , "repo1" )
testEditFile ( t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n" )
resp := testPullCreate ( t , session , "user1" , "repo1" , "master" , "[wip] This is a pull title" )
req := NewRequest ( t , "GET" , resp . Header ( ) . Get ( "Location" ) )
resp = session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
text := strings . TrimSpace ( htmlDoc . doc . Find ( ".merge.segment > .text.grey" ) . Text ( ) )
assert . NotEmpty ( t , text , "Can't find WIP text" )
// remove <strong /> from lang
expected := i18n . Tr ( "en" , "repo.pulls.cannot_merge_work_in_progress" , "[wip]" )
replacer := strings . NewReplacer ( "<strong>" , "" , "</strong>" , "" )
assert . Equal ( t , replacer . Replace ( expected ) , text , "Unable to find WIP text" )
}