2017-06-07 05:27:49 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2017-06-07 05:27:49 +03:00
2022-09-02 22:18:23 +03:00
package integration
2017-06-07 05:27:49 +03:00
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"
2024-11-18 06:06:25 +03:00
"code.gitea.io/gitea/models/db"
org_model "code.gitea.io/gitea/models/organization"
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"
2024-11-18 06:06:25 +03:00
"code.gitea.io/gitea/modules/structs"
2024-11-28 00:12:26 +03:00
org_service "code.gitea.io/gitea/services/org"
2022-09-02 22:18:23 +03:00
"code.gitea.io/gitea/tests"
2017-10-15 18:06:07 +03:00
2017-06-07 05:27:49 +03:00
"github.com/stretchr/testify/assert"
)
2024-05-21 20:00:35 +03:00
func testRepoFork ( t * testing . T , session * TestSession , ownerName , repoName , forkOwnerName , forkRepoName , forkBranch string ) * httptest . ResponseRecorder {
2022-08-16 05:22:25 +03:00
forkOwner := unittest . AssertExistsAndLoadBean ( t , & user_model . User { Name : forkOwnerName } )
2017-10-15 18:06:07 +03:00
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 )
2021-11-18 04:33:06 +03:00
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 )
2021-11-18 04:33:06 +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 )
2024-03-01 15:52:30 +03:00
link , exists := htmlDoc . doc . Find ( ` a.ui.button[href*="/fork"] ` ) . Attr ( "href" )
2017-06-07 05:27:49 +03:00
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 )
2024-03-01 15:52:30 +03:00
link , exists = htmlDoc . doc . Find ( ` form.ui.form[action*="/fork"] ` ) . Attr ( "action" )
2017-06-07 05:27:49 +03:00
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 {
2024-05-21 20:00:35 +03:00
"_csrf" : htmlDoc . GetCSRF ( ) ,
"uid" : fmt . Sprintf ( "%d" , forkOwner . ID ) ,
"repo_name" : forkRepoName ,
"fork_single_branch" : forkBranch ,
2017-06-17 07:49:45 +03:00
} )
2022-06-20 13:02:49 +03:00
session . MakeRequest ( t , req , http . StatusSeeOther )
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 ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2017-06-17 07:49:45 +03:00
session := loginUser ( t , "user1" )
2024-05-21 20:00:35 +03:00
testRepoFork ( t , session , "user2" , "repo1" , "user1" , "repo1" , "" )
2017-10-15 18:06:07 +03:00
}
func TestRepoForkToOrg ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2017-10-15 18:06:07 +03:00
session := loginUser ( t , "user2" )
2024-05-21 20:00:35 +03:00
testRepoFork ( t , session , "user2" , "repo1" , "org3" , "repo1" , "" )
2017-10-15 18:06:07 +03:00
// Check that no more forking is allowed as user2 owns repository
2023-09-14 05:59:53 +03:00
// and org3 organization that owner user2 is also now has forked this repository
2017-10-15 18:06:07 +03:00
req := NewRequest ( t , "GET" , "/user2/repo1" )
resp := session . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
2024-03-01 15:52:30 +03:00
_ , exists := htmlDoc . doc . Find ( ` a.ui.button[href*="/fork"] ` ) . Attr ( "href" )
2017-10-15 18:06:07 +03:00
assert . False ( t , exists , "Forking should not be allowed anymore" )
2017-06-07 05:27:49 +03:00
}
2024-11-18 06:06:25 +03:00
func TestForkListLimitedAndPrivateRepos ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
forkItemSelector := ".repo-fork-item"
user1Sess := loginUser ( t , "user1" )
user1 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { Name : "user1" } )
// fork to a limited org
limitedOrg := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 22 } )
assert . EqualValues ( t , structs . VisibleTypeLimited , limitedOrg . Visibility )
ownerTeam1 , err := org_model . OrgFromUser ( limitedOrg ) . GetOwnerTeam ( db . DefaultContext )
assert . NoError ( t , err )
2024-11-28 00:12:26 +03:00
assert . NoError ( t , org_service . AddTeamMember ( db . DefaultContext , ownerTeam1 , user1 ) )
2024-11-18 06:06:25 +03:00
testRepoFork ( t , user1Sess , "user2" , "repo1" , limitedOrg . Name , "repo1" , "" )
// fork to a private org
user4Sess := loginUser ( t , "user4" )
user4 := unittest . AssertExistsAndLoadBean ( t , & user_model . User { Name : "user4" } )
privateOrg := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 23 } )
assert . EqualValues ( t , structs . VisibleTypePrivate , privateOrg . Visibility )
ownerTeam2 , err := org_model . OrgFromUser ( privateOrg ) . GetOwnerTeam ( db . DefaultContext )
assert . NoError ( t , err )
2024-11-28 00:12:26 +03:00
assert . NoError ( t , org_service . AddTeamMember ( db . DefaultContext , ownerTeam2 , user4 ) )
2024-11-18 06:06:25 +03:00
testRepoFork ( t , user4Sess , "user2" , "repo1" , privateOrg . Name , "repo1" , "" )
t . Run ( "Anonymous" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , "/user2/repo1/forks" )
resp := MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
assert . EqualValues ( t , 0 , htmlDoc . Find ( forkItemSelector ) . Length ( ) )
} )
t . Run ( "Logged in" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , "/user2/repo1/forks" )
resp := user1Sess . MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
assert . EqualValues ( t , 1 , htmlDoc . Find ( forkItemSelector ) . Length ( ) )
2024-11-28 00:12:26 +03:00
assert . NoError ( t , org_service . AddTeamMember ( db . DefaultContext , ownerTeam2 , user1 ) )
2024-11-18 06:06:25 +03:00
resp = user1Sess . MakeRequest ( t , req , http . StatusOK )
htmlDoc = NewHTMLParser ( t , resp . Body )
assert . EqualValues ( t , 2 , htmlDoc . Find ( forkItemSelector ) . Length ( ) )
} )
}