2017-06-07 05:27:49 +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 (
2017-10-15 18:06:07 +03:00
"fmt"
2017-06-07 05:27:49 +03:00
"net/http"
2017-12-04 01:46:01 +03:00
"net/http/httptest"
2017-06-07 05:27:49 +03:00
"testing"
2017-10-15 18:06:07 +03:00
"code.gitea.io/gitea/models"
2017-06-07 05:27:49 +03:00
"github.com/stretchr/testify/assert"
)
2017-12-04 01:46:01 +03:00
func testRepoFork ( t * testing . T , session * TestSession , ownerName , repoName , forkOwnerName , forkRepoName string ) * httptest . ResponseRecorder {
2017-10-15 18:06:07 +03:00
forkOwner := models . AssertExistsAndLoadBean ( t , & models . User { Name : forkOwnerName } ) . ( * models . User )
2017-06-07 05:27:49 +03:00
// Step0: check the existence of the to-fork repo
2017-10-15 18:06:07 +03:00
req := NewRequestf ( t , "GET" , "/%s/%s" , forkOwnerName , forkRepoName )
2017-07-07 22:36:47 +03:00
resp := session . MakeRequest ( t , req , http . StatusNotFound )
2017-06-07 05:27:49 +03:00
// Step1: go to the main page of repo
2017-10-15 18:06:07 +03:00
req = NewRequestf ( t , "GET" , "/%s/%s" , ownerName , repoName )
2017-07-07 22:36:47 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
2017-06-07 05:27:49 +03:00
// Step2: click the fork button
2017-06-17 19:29:59 +03:00
htmlDoc := NewHTMLParser ( t , resp . Body )
2017-06-07 05:27:49 +03:00
link , exists := htmlDoc . doc . Find ( "a.ui.button[href^=\"/repo/fork/\"]" ) . Attr ( "href" )
assert . True ( t , exists , "The template has changed" )
2017-06-10 03:41:36 +03:00
req = NewRequest ( t , "GET" , link )
2017-07-07 22:36:47 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
2017-06-07 05:27:49 +03:00
// Step3: fill the form of the forking
2017-06-17 19:29:59 +03:00
htmlDoc = NewHTMLParser ( t , resp . Body )
2017-06-07 05:27:49 +03:00
link , exists = htmlDoc . doc . Find ( "form.ui.form[action^=\"/repo/fork/\"]" ) . Attr ( "action" )
assert . True ( t , exists , "The template has changed" )
2017-10-15 18:06:07 +03:00
_ , exists = htmlDoc . doc . Find ( fmt . Sprintf ( ".owner.dropdown .item[data-value=\"%d\"]" , forkOwner . ID ) ) . Attr ( "data-value" )
assert . True ( t , exists , fmt . Sprintf ( "Fork owner '%s' is not present in select box" , forkOwnerName ) )
2017-06-17 07:49:45 +03:00
req = NewRequestWithValues ( t , "POST" , link , map [ string ] string {
"_csrf" : htmlDoc . GetCSRF ( ) ,
2017-10-15 18:06:07 +03:00
"uid" : fmt . Sprintf ( "%d" , forkOwner . ID ) ,
"repo_name" : forkRepoName ,
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-07 05:27:49 +03:00
// Step4: check the existence of the forked repo
2017-10-15 18:06:07 +03:00
req = NewRequestf ( t , "GET" , "/%s/%s" , forkOwnerName , forkRepoName )
2017-07-07 22:36:47 +03:00
resp = session . MakeRequest ( t , req , http . StatusOK )
2017-06-15 14:20:39 +03:00
return resp
2017-06-07 05:27:49 +03:00
}
func TestRepoFork ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer 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" )
}
func TestRepoForkToOrg ( t * testing . T ) {
2019-11-26 02:21:37 +03:00
defer prepareTestEnv ( t ) ( )
2017-10-15 18:06:07 +03:00
session := loginUser ( t , "user2" )
testRepoFork ( t , session , "user2" , "repo1" , "user3" , "repo1" )
// Check that no more forking is allowed as user2 owns repository
// and user3 organization that owner user2 is also now has forked this repository
req := NewRequest ( t , "GET" , "/user2/repo1" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
_ , exists := htmlDoc . doc . Find ( "a.ui.button[href^=\"/repo/fork/\"]" ) . Attr ( "href" )
assert . False ( t , exists , "Forking should not be allowed anymore" )
2017-06-07 05:27:49 +03:00
}