2017-05-02 03:49:55 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2017-05-02 03:49:55 +03:00
2022-09-02 15:18:23 -04:00
package integration
2017-05-02 03:49:55 +03:00
import (
"net/http"
2017-12-03 14:46:01 -08:00
"net/http/httptest"
2019-05-11 16:29:17 +01:00
"net/url"
2017-06-08 19:15:41 +08:00
"path"
2017-05-02 03:49:55 +03:00
"testing"
2023-04-14 03:45:33 +08:00
gitea_context "code.gitea.io/gitea/modules/context"
2023-01-16 16:00:22 +08:00
"code.gitea.io/gitea/modules/json"
2017-05-02 03:49:55 +03:00
"github.com/stretchr/testify/assert"
)
func TestCreateFile ( t * testing . T ) {
2019-05-11 16:29:17 +01:00
onGiteaRun ( t , func ( t * testing . T , u * url . URL ) {
session := loginUser ( t , "user2" )
2017-05-02 03:49:55 +03:00
2019-05-11 16:29:17 +01:00
// Request editor page
req := NewRequest ( t , "GET" , "/user2/repo1/_new/master/" )
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-05-02 03:49:55 +03:00
2019-05-11 16:29:17 +01:00
doc := NewHTMLParser ( t , resp . Body )
lastCommit := doc . GetInputValueByName ( "last_commit" )
assert . NotEmpty ( t , lastCommit )
2017-05-02 03:49:55 +03:00
2019-05-11 16:29:17 +01:00
// Save new file to master branch
req = NewRequestWithValues ( t , "POST" , "/user2/repo1/_new/master/" , map [ string ] string {
"_csrf" : doc . GetCSRF ( ) ,
"last_commit" : lastCommit ,
"tree_path" : "test.txt" ,
"content" : "Content" ,
"commit_choice" : "direct" ,
} )
2022-03-23 05:54:07 +01:00
session . MakeRequest ( t , req , http . StatusSeeOther )
2017-06-17 00:49:45 -04:00
} )
2017-05-02 03:49:55 +03:00
}
func TestCreateFileOnProtectedBranch ( t * testing . T ) {
2019-05-11 16:29:17 +01:00
onGiteaRun ( t , func ( t * testing . T , u * url . URL ) {
session := loginUser ( t , "user2" )
csrf := GetCSRF ( t , session , "/user2/repo1/settings/branches" )
// Change master branch to protected
2023-01-16 16:00:22 +08:00
req := NewRequestWithValues ( t , "POST" , "/user2/repo1/settings/branches/edit" , map [ string ] string {
"_csrf" : csrf ,
"rule_name" : "master" ,
"enable_push" : "true" ,
2019-05-11 16:29:17 +01:00
} )
2022-03-23 05:54:07 +01:00
session . MakeRequest ( t , req , http . StatusSeeOther )
2019-05-11 16:29:17 +01:00
// Check if master branch has been locked successfully
2023-04-14 03:45:33 +08:00
flashCookie := session . GetCookie ( gitea_context . CookieNameFlash )
2019-05-11 16:29:17 +01:00
assert . NotNil ( t , flashCookie )
2023-04-17 22:04:26 +00:00
assert . EqualValues ( t , "success%3DBranch%2Bprotection%2Bfor%2Brule%2B%2522master%2522%2Bhas%2Bbeen%2Bupdated." , flashCookie . Value )
2019-05-11 16:29:17 +01:00
// Request editor page
req = NewRequest ( t , "GET" , "/user2/repo1/_new/master/" )
2019-06-12 21:41:28 +02:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2019-05-11 16:29:17 +01:00
doc := NewHTMLParser ( t , resp . Body )
lastCommit := doc . GetInputValueByName ( "last_commit" )
assert . NotEmpty ( t , lastCommit )
// Save new file to master branch
req = NewRequestWithValues ( t , "POST" , "/user2/repo1/_new/master/" , map [ string ] string {
"_csrf" : doc . GetCSRF ( ) ,
"last_commit" : lastCommit ,
"tree_path" : "test.txt" ,
"content" : "Content" ,
"commit_choice" : "direct" ,
} )
resp = session . MakeRequest ( t , req , http . StatusOK )
// Check body for error message
2023-04-17 22:04:26 +00:00
assert . Contains ( t , resp . Body . String ( ) , "Cannot commit to protected branch "master"." )
2019-05-11 16:29:17 +01:00
// remove the protected branch
csrf = GetCSRF ( t , session , "/user2/repo1/settings/branches" )
2023-01-16 16:00:22 +08:00
2019-05-11 16:29:17 +01:00
// Change master branch to protected
2023-01-16 16:00:22 +08:00
req = NewRequestWithValues ( t , "POST" , "/user2/repo1/settings/branches/1/delete" , map [ string ] string {
"_csrf" : csrf ,
2019-05-11 16:29:17 +01:00
} )
2023-01-16 16:00:22 +08:00
resp = session . MakeRequest ( t , req , http . StatusOK )
res := make ( map [ string ] string )
assert . NoError ( t , json . NewDecoder ( resp . Body ) . Decode ( & res ) )
assert . EqualValues ( t , "/user2/repo1/settings/branches" , res [ "redirect" ] )
2019-05-11 16:29:17 +01:00
// Check if master branch has been locked successfully
2023-04-14 03:45:33 +08:00
flashCookie = session . GetCookie ( gitea_context . CookieNameFlash )
2019-05-11 16:29:17 +01:00
assert . NotNil ( t , flashCookie )
2023-04-17 22:04:26 +00:00
assert . EqualValues ( t , "error%3DRemoving%2Bbranch%2Bprotection%2Brule%2B%25221%2522%2Bfailed." , flashCookie . Value )
2017-09-14 16:16:22 +08:00
} )
2017-05-02 03:49:55 +03:00
}
2017-06-08 19:15:41 +08:00
2017-12-03 14:46:01 -08:00
func testEditFile ( t * testing . T , session * TestSession , user , repo , branch , filePath , newContent string ) * httptest . ResponseRecorder {
2017-06-08 19:15:41 +08:00
// Get to the 'edit this file' page
2017-06-09 20:41:36 -04:00
req := NewRequest ( t , "GET" , path . Join ( user , repo , "_edit" , branch , filePath ) )
2017-07-07 15:36:47 -04:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-08 19:15:41 +08:00
2017-06-17 11:29:59 -05:00
htmlDoc := NewHTMLParser ( t , resp . Body )
2017-06-08 19:15:41 +08:00
lastCommit := htmlDoc . GetInputValueByName ( "last_commit" )
assert . NotEmpty ( t , lastCommit )
// Submit the edits
2017-06-17 00:49:45 -04:00
req = NewRequestWithValues ( t , "POST" , path . Join ( user , repo , "_edit" , branch , filePath ) ,
map [ string ] string {
"_csrf" : htmlDoc . GetCSRF ( ) ,
"last_commit" : lastCommit ,
"tree_path" : filePath ,
"content" : newContent ,
"commit_choice" : "direct" ,
} ,
2017-06-08 19:15:41 +08:00
)
2022-06-20 12:02:49 +02:00
session . MakeRequest ( t , req , http . StatusSeeOther )
2017-06-08 19:15:41 +08:00
// Verify the change
2017-10-29 19:04:25 -07:00
req = NewRequest ( t , "GET" , path . Join ( user , repo , "raw/branch" , branch , filePath ) )
2017-07-07 15:36:47 -04:00
resp = session . MakeRequest ( t , req , http . StatusOK )
2017-12-03 14:46:01 -08:00
assert . EqualValues ( t , newContent , resp . Body . String ( ) )
2017-06-15 19:20:39 +08:00
return resp
2017-06-08 19:15:41 +08:00
}
2017-12-03 14:46:01 -08:00
func testEditFileToNewBranch ( t * testing . T , session * TestSession , user , repo , branch , targetBranch , filePath , newContent string ) * httptest . ResponseRecorder {
2017-06-21 04:00:03 +03:00
// Get to the 'edit this file' page
req := NewRequest ( t , "GET" , path . Join ( user , repo , "_edit" , branch , filePath ) )
2017-07-07 15:36:47 -04:00
resp := session . MakeRequest ( t , req , http . StatusOK )
2017-06-21 04:00:03 +03:00
htmlDoc := NewHTMLParser ( t , resp . Body )
lastCommit := htmlDoc . GetInputValueByName ( "last_commit" )
assert . NotEmpty ( t , lastCommit )
// Submit the edits
req = NewRequestWithValues ( t , "POST" , path . Join ( user , repo , "_edit" , branch , filePath ) ,
map [ string ] string {
"_csrf" : htmlDoc . GetCSRF ( ) ,
"last_commit" : lastCommit ,
"tree_path" : filePath ,
"content" : newContent ,
"commit_choice" : "commit-to-new-branch" ,
"new_branch_name" : targetBranch ,
} ,
)
2022-06-20 12:02:49 +02:00
session . MakeRequest ( t , req , http . StatusSeeOther )
2017-06-21 04:00:03 +03:00
// Verify the change
2017-10-29 19:04:25 -07:00
req = NewRequest ( t , "GET" , path . Join ( user , repo , "raw/branch" , targetBranch , filePath ) )
2017-07-07 15:36:47 -04:00
resp = session . MakeRequest ( t , req , http . StatusOK )
2017-12-03 14:46:01 -08:00
assert . EqualValues ( t , newContent , resp . Body . String ( ) )
2017-06-21 04:00:03 +03:00
return resp
}
2017-06-08 19:15:41 +08:00
func TestEditFile ( t * testing . T ) {
2019-05-11 16:29:17 +01:00
onGiteaRun ( t , func ( t * testing . T , u * url . URL ) {
session := loginUser ( t , "user2" )
testEditFile ( t , session , "user2" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n" )
} )
2017-06-08 19:15:41 +08:00
}
2017-06-21 04:00:03 +03:00
func TestEditFileToNewBranch ( t * testing . T ) {
2019-05-11 16:29:17 +01:00
onGiteaRun ( t , func ( t * testing . T , u * url . URL ) {
session := loginUser ( t , "user2" )
testEditFileToNewBranch ( t , session , "user2" , "repo1" , "master" , "feature/test" , "README.md" , "Hello, World (Edited)\n" )
} )
2017-06-21 04:00:03 +03:00
}