aboutsummaryrefslogtreecommitdiffstats
path: root/integrations
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2019-05-11 16:29:17 +0100
committertechknowlogick <hello@techknowlogick.com>2019-05-11 11:29:17 -0400
commitce8de3533485eed0c56059d6334a5031a73eed67 (patch)
tree2f8e5c84441467269a98fb450ddfaca236cfc2e7 /integrations
parent34eee25bd42d19287e3e33afd169cc979ab61f37 (diff)
downloadgitea-ce8de3533485eed0c56059d6334a5031a73eed67.tar.gz
gitea-ce8de3533485eed0c56059d6334a5031a73eed67.zip
Remove local clones & make hooks run on merge/edit/upload (#6672)
* Add options to git.Clone to make it more capable * Begin the process of removing the local copy and tidy up * Remove Wiki LocalCopy Checkouts * Remove the last LocalRepo helpers * Remove WithTemporaryFile * Enable push-hooks for these routes * Ensure tests cope with hooks Signed-off-by: Andrew Thornton <art27@cantab.net> * Remove Repository.LocalCopyPath() * Move temporary repo to use the standard temporary path * Fix the tests Signed-off-by: Andrew Thornton <art27@cantab.net> * Remove LocalWikiPath * Fix missing remove Signed-off-by: Andrew Thornton <art27@cantab.net> * Use AppURL for Oauth user link (#6894) * Use AppURL for Oauth user link Fix #6843 * Update oauth.go * Update oauth.go * internal/ssh: ignore env command totally (#6825) * ssh: ignore env command totally * Remove commented code Needed fix described in issue #6889 * Escape the commit message on issues update and title in telegram hook (#6901) * update sdk to latest (#6903) * improve description of branch protection (fix #6886) (#6906) The branch protection description text were not quite accurate. * Fix logging documentation (#6904) * ENABLE_MACARON_REDIRECT should be REDIRECT_MACARON_LOG * Allow DISABLE_ROUTER_LOG to be set in the [log] section * [skip ci] Updated translations via Crowdin * Move sdk structs to modules/structs (#6905) * move sdk structs to moduels/structs * fix tests * fix fmt * fix swagger * fix vendor
Diffstat (limited to 'integrations')
-rw-r--r--integrations/api_repo_file_content_test.go6
-rw-r--r--integrations/api_repo_file_create_test.go226
-rw-r--r--integrations/api_repo_file_delete_test.go224
-rw-r--r--integrations/api_repo_file_update_test.go290
-rw-r--r--integrations/editor_test.go146
-rw-r--r--integrations/integration_test.go1
-rw-r--r--integrations/pull_create_test.go113
-rw-r--r--integrations/pull_merge_test.go161
-rw-r--r--integrations/pull_status_test.go132
-rw-r--r--integrations/repo_activity_test.go93
-rw-r--r--integrations/repo_branch_test.go5
-rw-r--r--integrations/repofiles_delete_test.go193
-rw-r--r--integrations/repofiles_update_test.go365
13 files changed, 1274 insertions, 681 deletions
diff --git a/integrations/api_repo_file_content_test.go b/integrations/api_repo_file_content_test.go
index 1f535ef3a0..896d811083 100644
--- a/integrations/api_repo_file_content_test.go
+++ b/integrations/api_repo_file_content_test.go
@@ -6,6 +6,7 @@ package integrations
import (
"net/http"
+ "net/url"
"path/filepath"
"testing"
@@ -40,7 +41,10 @@ func getExpectedFileContentResponseForFileContents(branch string) *api.FileConte
}
func TestAPIGetFileContents(t *testing.T) {
- prepareTestEnv(t)
+ onGiteaRun(t, testAPIGetFileContents)
+}
+
+func testAPIGetFileContents(t *testing.T, u *url.URL) {
user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) // owner of the repo1 & repo16
user3 := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User) // owner of the repo3, is an org
user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User) // owner of neither repos
diff --git a/integrations/api_repo_file_create_test.go b/integrations/api_repo_file_create_test.go
index a43855b06c..28097179a0 100644
--- a/integrations/api_repo_file_create_test.go
+++ b/integrations/api_repo_file_create_test.go
@@ -8,6 +8,7 @@ import (
"encoding/base64"
"fmt"
"net/http"
+ "net/url"
"path/filepath"
"testing"
@@ -91,125 +92,126 @@ func getExpectedFileResponseForCreate(commitID, treePath string) *api.FileRespon
}
func TestAPICreateFile(t *testing.T) {
- prepareTestEnv(t)
- user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) // owner of the repo1 & repo16
- user3 := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User) // owner of the repo3, is an org
- user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User) // owner of neither repos
- repo1 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) // public repo
- repo3 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository) // public repo
- repo16 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository) // private repo
- fileID := 0
-
- // Get user2's token
- session := loginUser(t, user2.Name)
- token2 := getTokenForLoggedInUser(t, session)
- session = emptyTestSession(t)
- // Get user4's token
- session = loginUser(t, user4.Name)
- token4 := getTokenForLoggedInUser(t, session)
- session = emptyTestSession(t)
-
- // Test creating a file in repo1 which user2 owns, try both with branch and empty branch
- for _, branch := range [...]string{
- "master", // Branch
- "", // Empty branch
- } {
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) // owner of the repo1 & repo16
+ user3 := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User) // owner of the repo3, is an org
+ user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User) // owner of neither repos
+ repo1 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) // public repo
+ repo3 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository) // public repo
+ repo16 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository) // private repo
+ fileID := 0
+
+ // Get user2's token
+ session := loginUser(t, user2.Name)
+ token2 := getTokenForLoggedInUser(t, session)
+ session = emptyTestSession(t)
+ // Get user4's token
+ session = loginUser(t, user4.Name)
+ token4 := getTokenForLoggedInUser(t, session)
+ session = emptyTestSession(t)
+
+ // Test creating a file in repo1 which user2 owns, try both with branch and empty branch
+ for _, branch := range [...]string{
+ "master", // Branch
+ "", // Empty branch
+ } {
+ createFileOptions := getCreateFileOptions()
+ createFileOptions.BranchName = branch
+ fileID++
+ treePath := fmt.Sprintf("new/file%d.txt", fileID)
+ url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
+ req := NewRequestWithJSON(t, "POST", url, &createFileOptions)
+ resp := session.MakeRequest(t, req, http.StatusCreated)
+ gitRepo, _ := git.OpenRepository(repo1.RepoPath())
+ commitID, _ := gitRepo.GetBranchCommitID(createFileOptions.NewBranchName)
+ expectedFileResponse := getExpectedFileResponseForCreate(commitID, treePath)
+ var fileResponse api.FileResponse
+ DecodeJSON(t, resp, &fileResponse)
+ assert.EqualValues(t, expectedFileResponse.Content, fileResponse.Content)
+ assert.EqualValues(t, expectedFileResponse.Commit.SHA, fileResponse.Commit.SHA)
+ assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, fileResponse.Commit.HTMLURL)
+ assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, fileResponse.Commit.Author.Email)
+ assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, fileResponse.Commit.Author.Name)
+ }
+
+ // Test creating a file in a new branch
createFileOptions := getCreateFileOptions()
- createFileOptions.BranchName = branch
+ createFileOptions.BranchName = repo1.DefaultBranch
+ createFileOptions.NewBranchName = "new_branch"
fileID++
treePath := fmt.Sprintf("new/file%d.txt", fileID)
url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
req := NewRequestWithJSON(t, "POST", url, &createFileOptions)
resp := session.MakeRequest(t, req, http.StatusCreated)
- gitRepo, _ := git.OpenRepository(repo1.RepoPath())
- commitID, _ := gitRepo.GetBranchCommitID(createFileOptions.NewBranchName)
- expectedFileResponse := getExpectedFileResponseForCreate(commitID, treePath)
var fileResponse api.FileResponse
DecodeJSON(t, resp, &fileResponse)
- assert.EqualValues(t, expectedFileResponse.Content, fileResponse.Content)
- assert.EqualValues(t, expectedFileResponse.Commit.SHA, fileResponse.Commit.SHA)
- assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, fileResponse.Commit.HTMLURL)
- assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, fileResponse.Commit.Author.Email)
- assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, fileResponse.Commit.Author.Name)
- }
+ expectedSHA := "a635aa942442ddfdba07468cf9661c08fbdf0ebf"
+ expectedHTMLURL := fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/blob/new_branch/new/file%d.txt", fileID)
+ expectedDownloadURL := fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/raw/branch/new_branch/new/file%d.txt", fileID)
+ assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
+ assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
+ assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
+
+ // Test trying to create a file that already exists, should fail
+ createFileOptions = getCreateFileOptions()
+ treePath = "README.md"
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
+ resp = session.MakeRequest(t, req, http.StatusInternalServerError)
+ expectedAPIError := context.APIError{
+ Message: "repository file already exists [path: " + treePath + "]",
+ URL: base.DocURL,
+ }
+ var apiError context.APIError
+ DecodeJSON(t, resp, &apiError)
+ assert.Equal(t, expectedAPIError, apiError)
+
+ // Test creating a file in repo1 by user4 who does not have write access
+ createFileOptions = getCreateFileOptions()
+ fileID++
+ treePath = fmt.Sprintf("new/file%d.txt", fileID)
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token4)
+ req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
+ session.MakeRequest(t, req, http.StatusNotFound)
- // Test creating a file in a new branch
- createFileOptions := getCreateFileOptions()
- createFileOptions.BranchName = repo1.DefaultBranch
- createFileOptions.NewBranchName = "new_branch"
- fileID++
- treePath := fmt.Sprintf("new/file%d.txt", fileID)
- url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
- req := NewRequestWithJSON(t, "POST", url, &createFileOptions)
- resp := session.MakeRequest(t, req, http.StatusCreated)
- var fileResponse api.FileResponse
- DecodeJSON(t, resp, &fileResponse)
- expectedSHA := "a635aa942442ddfdba07468cf9661c08fbdf0ebf"
- expectedHTMLURL := fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/blob/new_branch/new/file%d.txt", fileID)
- expectedDownloadURL := fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/raw/branch/new_branch/new/file%d.txt", fileID)
- assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
- assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
- assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
-
- // Test trying to create a file that already exists, should fail
- createFileOptions = getCreateFileOptions()
- treePath = "README.md"
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
- req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
- resp = session.MakeRequest(t, req, http.StatusInternalServerError)
- expectedAPIError := context.APIError{
- Message: "repository file already exists [path: " + treePath + "]",
- URL: base.DocURL,
- }
- var apiError context.APIError
- DecodeJSON(t, resp, &apiError)
- assert.Equal(t, expectedAPIError, apiError)
-
- // Test creating a file in repo1 by user4 who does not have write access
- createFileOptions = getCreateFileOptions()
- fileID++
- treePath = fmt.Sprintf("new/file%d.txt", fileID)
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token4)
- req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
- session.MakeRequest(t, req, http.StatusNotFound)
-
- // Tests a repo with no token given so will fail
- createFileOptions = getCreateFileOptions()
- fileID++
- treePath = fmt.Sprintf("new/file%d.txt", fileID)
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo16.Name, treePath)
- req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
- session.MakeRequest(t, req, http.StatusNotFound)
-
- // Test using access token for a private repo that the user of the token owns
- createFileOptions = getCreateFileOptions()
- fileID++
- treePath = fmt.Sprintf("new/file%d.txt", fileID)
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token2)
- req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
- session.MakeRequest(t, req, http.StatusCreated)
-
- // Test using org repo "user3/repo3" where user2 is a collaborator
- createFileOptions = getCreateFileOptions()
- fileID++
- treePath = fmt.Sprintf("new/file%d.txt", fileID)
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user3.Name, repo3.Name, treePath, token2)
- req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
- session.MakeRequest(t, req, http.StatusCreated)
-
- // Test using org repo "user3/repo3" with no user token
- createFileOptions = getCreateFileOptions()
- fileID++
- treePath = fmt.Sprintf("new/file%d.txt", fileID)
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user3.Name, repo3.Name, treePath)
- req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
- session.MakeRequest(t, req, http.StatusNotFound)
-
- // Test using repo "user2/repo1" where user4 is a NOT collaborator
- createFileOptions = getCreateFileOptions()
- fileID++
- treePath = fmt.Sprintf("new/file%d.txt", fileID)
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token4)
- req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
- session.MakeRequest(t, req, http.StatusForbidden)
+ // Tests a repo with no token given so will fail
+ createFileOptions = getCreateFileOptions()
+ fileID++
+ treePath = fmt.Sprintf("new/file%d.txt", fileID)
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo16.Name, treePath)
+ req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
+ session.MakeRequest(t, req, http.StatusNotFound)
+
+ // Test using access token for a private repo that the user of the token owns
+ createFileOptions = getCreateFileOptions()
+ fileID++
+ treePath = fmt.Sprintf("new/file%d.txt", fileID)
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
+ session.MakeRequest(t, req, http.StatusCreated)
+
+ // Test using org repo "user3/repo3" where user2 is a collaborator
+ createFileOptions = getCreateFileOptions()
+ fileID++
+ treePath = fmt.Sprintf("new/file%d.txt", fileID)
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user3.Name, repo3.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
+ session.MakeRequest(t, req, http.StatusCreated)
+
+ // Test using org repo "user3/repo3" with no user token
+ createFileOptions = getCreateFileOptions()
+ fileID++
+ treePath = fmt.Sprintf("new/file%d.txt", fileID)
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user3.Name, repo3.Name, treePath)
+ req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
+ session.MakeRequest(t, req, http.StatusNotFound)
+
+ // Test using repo "user2/repo1" where user4 is a NOT collaborator
+ createFileOptions = getCreateFileOptions()
+ fileID++
+ treePath = fmt.Sprintf("new/file%d.txt", fileID)
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token4)
+ req = NewRequestWithJSON(t, "POST", url, &createFileOptions)
+ session.MakeRequest(t, req, http.StatusForbidden)
+ })
}
diff --git a/integrations/api_repo_file_delete_test.go b/integrations/api_repo_file_delete_test.go
index b619f9c43c..57e2539e19 100644
--- a/integrations/api_repo_file_delete_test.go
+++ b/integrations/api_repo_file_delete_test.go
@@ -7,6 +7,7 @@ package integrations
import (
"fmt"
"net/http"
+ "net/url"
"testing"
"code.gitea.io/gitea/models"
@@ -37,34 +38,50 @@ func getDeleteFileOptions() *api.DeleteFileOptions {
}
func TestAPIDeleteFile(t *testing.T) {
- prepareTestEnv(t)
- user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) // owner of the repo1 & repo16
- user3 := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User) // owner of the repo3, is an org
- user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User) // owner of neither repos
- repo1 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) // public repo
- repo3 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository) // public repo
- repo16 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository) // private repo
- fileID := 0
-
- // Get user2's token
- session := loginUser(t, user2.Name)
- token2 := getTokenForLoggedInUser(t, session)
- session = emptyTestSession(t)
- // Get user4's token
- session = loginUser(t, user4.Name)
- token4 := getTokenForLoggedInUser(t, session)
- session = emptyTestSession(t)
-
- // Test deleting a file in repo1 which user2 owns, try both with branch and empty branch
- for _, branch := range [...]string{
- "master", // Branch
- "", // Empty branch
- } {
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) // owner of the repo1 & repo16
+ user3 := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User) // owner of the repo3, is an org
+ user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User) // owner of neither repos
+ repo1 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) // public repo
+ repo3 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository) // public repo
+ repo16 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository) // private repo
+ fileID := 0
+
+ // Get user2's token
+ session := loginUser(t, user2.Name)
+ token2 := getTokenForLoggedInUser(t, session)
+ session = emptyTestSession(t)
+ // Get user4's token
+ session = loginUser(t, user4.Name)
+ token4 := getTokenForLoggedInUser(t, session)
+ session = emptyTestSession(t)
+
+ // Test deleting a file in repo1 which user2 owns, try both with branch and empty branch
+ for _, branch := range [...]string{
+ "master", // Branch
+ "", // Empty branch
+ } {
+ fileID++
+ treePath := fmt.Sprintf("delete/file%d.txt", fileID)
+ createFile(user2, repo1, treePath)
+ deleteFileOptions := getDeleteFileOptions()
+ deleteFileOptions.BranchName = branch
+ url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
+ req := NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
+ resp := session.MakeRequest(t, req, http.StatusOK)
+ var fileResponse api.FileResponse
+ DecodeJSON(t, resp, &fileResponse)
+ assert.NotNil(t, fileResponse)
+ assert.Nil(t, fileResponse.Content)
+ }
+
+ // Test deleting file and making the delete in a new branch
fileID++
treePath := fmt.Sprintf("delete/file%d.txt", fileID)
createFile(user2, repo1, treePath)
deleteFileOptions := getDeleteFileOptions()
- deleteFileOptions.BranchName = branch
+ deleteFileOptions.BranchName = repo1.DefaultBranch
+ deleteFileOptions.NewBranchName = "new_branch"
url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
req := NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
resp := session.MakeRequest(t, req, http.StatusOK)
@@ -72,92 +89,77 @@ func TestAPIDeleteFile(t *testing.T) {
DecodeJSON(t, resp, &fileResponse)
assert.NotNil(t, fileResponse)
assert.Nil(t, fileResponse.Content)
- }
- // Test deleting file and making the delete in a new branch
- fileID++
- treePath := fmt.Sprintf("delete/file%d.txt", fileID)
- createFile(user2, repo1, treePath)
- deleteFileOptions := getDeleteFileOptions()
- deleteFileOptions.BranchName = repo1.DefaultBranch
- deleteFileOptions.NewBranchName = "new_branch"
- url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
- req := NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
- resp := session.MakeRequest(t, req, http.StatusOK)
- var fileResponse api.FileResponse
- DecodeJSON(t, resp, &fileResponse)
- assert.NotNil(t, fileResponse)
- assert.Nil(t, fileResponse.Content)
-
- // Test deleting a file with the wrong SHA
- fileID++
- treePath = fmt.Sprintf("delete/file%d.txt", fileID)
- createFile(user2, repo1, treePath)
- deleteFileOptions = getDeleteFileOptions()
- correctSHA := deleteFileOptions.SHA
- deleteFileOptions.SHA = "badsha"
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
- req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
- resp = session.MakeRequest(t, req, http.StatusInternalServerError)
- expectedAPIError := context.APIError{
- Message: "sha does not match [given: " + deleteFileOptions.SHA + ", expected: " + correctSHA + "]",
- URL: base.DocURL,
- }
- var apiError context.APIError
- DecodeJSON(t, resp, &apiError)
- assert.Equal(t, expectedAPIError, apiError)
-
- // Test creating a file in repo1 by user4 who does not have write access
- fileID++
- treePath = fmt.Sprintf("delete/file%d.txt", fileID)
- createFile(user2, repo16, treePath)
- deleteFileOptions = getDeleteFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token4)
- req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
- session.MakeRequest(t, req, http.StatusNotFound)
-
- // Tests a repo with no token given so will fail
- fileID++
- treePath = fmt.Sprintf("delete/file%d.txt", fileID)
- createFile(user2, repo16, treePath)
- deleteFileOptions = getDeleteFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo16.Name, treePath)
- req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
- session.MakeRequest(t, req, http.StatusNotFound)
-
- // Test using access token for a private repo that the user of the token owns
- fileID++
- treePath = fmt.Sprintf("delete/file%d.txt", fileID)
- createFile(user2, repo16, treePath)
- deleteFileOptions = getDeleteFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token2)
- req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
- session.MakeRequest(t, req, http.StatusOK)
-
- // Test using org repo "user3/repo3" where user2 is a collaborator
- fileID++
- treePath = fmt.Sprintf("delete/file%d.txt", fileID)
- createFile(user3, repo3, treePath)
- deleteFileOptions = getDeleteFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user3.Name, repo3.Name, treePath, token2)
- req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
- session.MakeRequest(t, req, http.StatusOK)
-
- // Test using org repo "user3/repo3" with no user token
- fileID++
- treePath = fmt.Sprintf("delete/file%d.txt", fileID)
- createFile(user3, repo3, treePath)
- deleteFileOptions = getDeleteFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user3.Name, repo3.Name, treePath)
- req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
- session.MakeRequest(t, req, http.StatusNotFound)
-
- // Test using repo "user2/repo1" where user4 is a NOT collaborator
- fileID++
- treePath = fmt.Sprintf("delete/file%d.txt", fileID)
- createFile(user2, repo1, treePath)
- deleteFileOptions = getDeleteFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token4)
- req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
- session.MakeRequest(t, req, http.StatusForbidden)
+ // Test deleting a file with the wrong SHA
+ fileID++
+ treePath = fmt.Sprintf("delete/file%d.txt", fileID)
+ createFile(user2, repo1, treePath)
+ deleteFileOptions = getDeleteFileOptions()
+ correctSHA := deleteFileOptions.SHA
+ deleteFileOptions.SHA = "badsha"
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
+ resp = session.MakeRequest(t, req, http.StatusInternalServerError)
+ expectedAPIError := context.APIError{
+ Message: "sha does not match [given: " + deleteFileOptions.SHA + ", expected: " + correctSHA + "]",
+ URL: base.DocURL,
+ }
+ var apiError context.APIError
+ DecodeJSON(t, resp, &apiError)
+ assert.Equal(t, expectedAPIError, apiError)
+
+ // Test creating a file in repo1 by user4 who does not have write access
+ fileID++
+ treePath = fmt.Sprintf("delete/file%d.txt", fileID)
+ createFile(user2, repo16, treePath)
+ deleteFileOptions = getDeleteFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token4)
+ req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
+ session.MakeRequest(t, req, http.StatusNotFound)
+
+ // Tests a repo with no token given so will fail
+ fileID++
+ treePath = fmt.Sprintf("delete/file%d.txt", fileID)
+ createFile(user2, repo16, treePath)
+ deleteFileOptions = getDeleteFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo16.Name, treePath)
+ req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
+ session.MakeRequest(t, req, http.StatusNotFound)
+
+ // Test using access token for a private repo that the user of the token owns
+ fileID++
+ treePath = fmt.Sprintf("delete/file%d.txt", fileID)
+ createFile(user2, repo16, treePath)
+ deleteFileOptions = getDeleteFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
+ session.MakeRequest(t, req, http.StatusOK)
+
+ // Test using org repo "user3/repo3" where user2 is a collaborator
+ fileID++
+ treePath = fmt.Sprintf("delete/file%d.txt", fileID)
+ createFile(user3, repo3, treePath)
+ deleteFileOptions = getDeleteFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user3.Name, repo3.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
+ session.MakeRequest(t, req, http.StatusOK)
+
+ // Test using org repo "user3/repo3" with no user token
+ fileID++
+ treePath = fmt.Sprintf("delete/file%d.txt", fileID)
+ createFile(user3, repo3, treePath)
+ deleteFileOptions = getDeleteFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user3.Name, repo3.Name, treePath)
+ req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
+ session.MakeRequest(t, req, http.StatusNotFound)
+
+ // Test using repo "user2/repo1" where user4 is a NOT collaborator
+ fileID++
+ treePath = fmt.Sprintf("delete/file%d.txt", fileID)
+ createFile(user2, repo1, treePath)
+ deleteFileOptions = getDeleteFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token4)
+ req = NewRequestWithJSON(t, "DELETE", url, &deleteFileOptions)
+ session.MakeRequest(t, req, http.StatusForbidden)
+ })
}
diff --git a/integrations/api_repo_file_update_test.go b/integrations/api_repo_file_update_test.go
index 71994564ff..37438339bb 100644
--- a/integrations/api_repo_file_update_test.go
+++ b/integrations/api_repo_file_update_test.go
@@ -8,6 +8,7 @@ import (
"encoding/base64"
"fmt"
"net/http"
+ "net/url"
"path/filepath"
"testing"
@@ -79,156 +80,157 @@ func getExpectedFileResponseForUpdate(commitID, treePath string) *api.FileRespon
}
func TestAPIUpdateFile(t *testing.T) {
- prepareTestEnv(t)
- user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) // owner of the repo1 & repo16
- user3 := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User) // owner of the repo3, is an org
- user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User) // owner of neither repos
- repo1 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) // public repo
- repo3 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository) // public repo
- repo16 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository) // private repo
- fileID := 0
-
- // Get user2's token
- session := loginUser(t, user2.Name)
- token2 := getTokenForLoggedInUser(t, session)
- session = emptyTestSession(t)
- // Get user4's token
- session = loginUser(t, user4.Name)
- token4 := getTokenForLoggedInUser(t, session)
- session = emptyTestSession(t)
-
- // Test updating a file in repo1 which user2 owns, try both with branch and empty branch
- for _, branch := range [...]string{
- "master", // Branch
- "", // Empty branch
- } {
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User) // owner of the repo1 & repo16
+ user3 := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User) // owner of the repo3, is an org
+ user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User) // owner of neither repos
+ repo1 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository) // public repo
+ repo3 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository) // public repo
+ repo16 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository) // private repo
+ fileID := 0
+
+ // Get user2's token
+ session := loginUser(t, user2.Name)
+ token2 := getTokenForLoggedInUser(t, session)
+ session = emptyTestSession(t)
+ // Get user4's token
+ session = loginUser(t, user4.Name)
+ token4 := getTokenForLoggedInUser(t, session)
+ session = emptyTestSession(t)
+
+ // Test updating a file in repo1 which user2 owns, try both with branch and empty branch
+ for _, branch := range [...]string{
+ "master", // Branch
+ "", // Empty branch
+ } {
+ fileID++
+ treePath := fmt.Sprintf("update/file%d.txt", fileID)
+ createFile(user2, repo1, treePath)
+ updateFileOptions := getUpdateFileOptions()
+ updateFileOptions.BranchName = branch
+ url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
+ req := NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
+ resp := session.MakeRequest(t, req, http.StatusOK)
+ gitRepo, _ := git.OpenRepository(repo1.RepoPath())
+ commitID, _ := gitRepo.GetBranchCommitID(updateFileOptions.NewBranchName)
+ expectedFileResponse := getExpectedFileResponseForUpdate(commitID, treePath)
+ var fileResponse api.FileResponse
+ DecodeJSON(t, resp, &fileResponse)
+ assert.EqualValues(t, expectedFileResponse.Content, fileResponse.Content)
+ assert.EqualValues(t, expectedFileResponse.Commit.SHA, fileResponse.Commit.SHA)
+ assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, fileResponse.Commit.HTMLURL)
+ assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, fileResponse.Commit.Author.Email)
+ assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, fileResponse.Commit.Author.Name)
+ }
+
+ // Test updating a file in a new branch
+ updateFileOptions := getUpdateFileOptions()
+ updateFileOptions.BranchName = repo1.DefaultBranch
+ updateFileOptions.NewBranchName = "new_branch"
fileID++
treePath := fmt.Sprintf("update/file%d.txt", fileID)
createFile(user2, repo1, treePath)
- updateFileOptions := getUpdateFileOptions()
- updateFileOptions.BranchName = branch
url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
req := NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
resp := session.MakeRequest(t, req, http.StatusOK)
- gitRepo, _ := git.OpenRepository(repo1.RepoPath())
- commitID, _ := gitRepo.GetBranchCommitID(updateFileOptions.NewBranchName)
- expectedFileResponse := getExpectedFileResponseForUpdate(commitID, treePath)
var fileResponse api.FileResponse
DecodeJSON(t, resp, &fileResponse)
- assert.EqualValues(t, expectedFileResponse.Content, fileResponse.Content)
- assert.EqualValues(t, expectedFileResponse.Commit.SHA, fileResponse.Commit.SHA)
- assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, fileResponse.Commit.HTMLURL)
- assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, fileResponse.Commit.Author.Email)
- assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, fileResponse.Commit.Author.Name)
- }
-
- // Test updating a file in a new branch
- updateFileOptions := getUpdateFileOptions()
- updateFileOptions.BranchName = repo1.DefaultBranch
- updateFileOptions.NewBranchName = "new_branch"
- fileID++
- treePath := fmt.Sprintf("update/file%d.txt", fileID)
- createFile(user2, repo1, treePath)
- url := fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
- req := NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
- resp := session.MakeRequest(t, req, http.StatusOK)
- var fileResponse api.FileResponse
- DecodeJSON(t, resp, &fileResponse)
- expectedSHA := "08bd14b2e2852529157324de9c226b3364e76136"
- expectedHTMLURL := fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/blob/new_branch/update/file%d.txt", fileID)
- expectedDownloadURL := fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/raw/branch/new_branch/update/file%d.txt", fileID)
- assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
- assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
- assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
-
- // Test updating a file and renaming it
- updateFileOptions = getUpdateFileOptions()
- updateFileOptions.BranchName = repo1.DefaultBranch
- fileID++
- treePath = fmt.Sprintf("update/file%d.txt", fileID)
- createFile(user2, repo1, treePath)
- updateFileOptions.FromPath = treePath
- treePath = "rename/" + treePath
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
- req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
- resp = session.MakeRequest(t, req, http.StatusOK)
- DecodeJSON(t, resp, &fileResponse)
- expectedSHA = "08bd14b2e2852529157324de9c226b3364e76136"
- expectedHTMLURL = fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/blob/master/rename/update/file%d.txt", fileID)
- expectedDownloadURL = fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/raw/branch/master/rename/update/file%d.txt", fileID)
- assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
- assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
- assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
-
- // Test updating a file with the wrong SHA
- fileID++
- treePath = fmt.Sprintf("update/file%d.txt", fileID)
- createFile(user2, repo1, treePath)
- updateFileOptions = getUpdateFileOptions()
- correctSHA := updateFileOptions.SHA
- updateFileOptions.SHA = "badsha"
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
- req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
- resp = session.MakeRequest(t, req, http.StatusInternalServerError)
- expectedAPIError := context.APIError{
- Message: "sha does not match [given: " + updateFileOptions.SHA + ", expected: " + correctSHA + "]",
- URL: base.DocURL,
- }
- var apiError context.APIError
- DecodeJSON(t, resp, &apiError)
- assert.Equal(t, expectedAPIError, apiError)
-
- // Test creating a file in repo1 by user4 who does not have write access
- fileID++
- treePath = fmt.Sprintf("update/file%d.txt", fileID)
- createFile(user2, repo16, treePath)
- updateFileOptions = getUpdateFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token4)
- req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
- session.MakeRequest(t, req, http.StatusNotFound)
-
- // Tests a repo with no token given so will fail
- fileID++
- treePath = fmt.Sprintf("update/file%d.txt", fileID)
- createFile(user2, repo16, treePath)
- updateFileOptions = getUpdateFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo16.Name, treePath)
- req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
- session.MakeRequest(t, req, http.StatusNotFound)
-
- // Test using access token for a private repo that the user of the token owns
- fileID++
- treePath = fmt.Sprintf("update/file%d.txt", fileID)
- createFile(user2, repo16, treePath)
- updateFileOptions = getUpdateFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token2)
- req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
- session.MakeRequest(t, req, http.StatusOK)
-
- // Test using org repo "user3/repo3" where user2 is a collaborator
- fileID++
- treePath = fmt.Sprintf("update/file%d.txt", fileID)
- createFile(user3, repo3, treePath)
- updateFileOptions = getUpdateFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user3.Name, repo3.Name, treePath, token2)
- req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
- session.MakeRequest(t, req, http.StatusOK)
-
- // Test using org repo "user3/repo3" with no user token
- fileID++
- treePath = fmt.Sprintf("update/file%d.txt", fileID)
- createFile(user3, repo3, treePath)
- updateFileOptions = getUpdateFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user3.Name, repo3.Name, treePath)
- req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
- session.MakeRequest(t, req, http.StatusNotFound)
-
- // Test using repo "user2/repo1" where user4 is a NOT collaborator
- fileID++
- treePath = fmt.Sprintf("update/file%d.txt", fileID)
- createFile(user2, repo1, treePath)
- updateFileOptions = getUpdateFileOptions()
- url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token4)
- req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
- session.MakeRequest(t, req, http.StatusForbidden)
+ expectedSHA := "08bd14b2e2852529157324de9c226b3364e76136"
+ expectedHTMLURL := fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/blob/new_branch/update/file%d.txt", fileID)
+ expectedDownloadURL := fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/raw/branch/new_branch/update/file%d.txt", fileID)
+ assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
+ assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
+ assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
+
+ // Test updating a file and renaming it
+ updateFileOptions = getUpdateFileOptions()
+ updateFileOptions.BranchName = repo1.DefaultBranch
+ fileID++
+ treePath = fmt.Sprintf("update/file%d.txt", fileID)
+ createFile(user2, repo1, treePath)
+ updateFileOptions.FromPath = treePath
+ treePath = "rename/" + treePath
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
+ resp = session.MakeRequest(t, req, http.StatusOK)
+ DecodeJSON(t, resp, &fileResponse)
+ expectedSHA = "08bd14b2e2852529157324de9c226b3364e76136"
+ expectedHTMLURL = fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/blob/master/rename/update/file%d.txt", fileID)
+ expectedDownloadURL = fmt.Sprintf("http://localhost:"+setting.HTTPPort+"/user2/repo1/raw/branch/master/rename/update/file%d.txt", fileID)
+ assert.EqualValues(t, expectedSHA, fileResponse.Content.SHA)
+ assert.EqualValues(t, expectedHTMLURL, fileResponse.Content.HTMLURL)
+ assert.EqualValues(t, expectedDownloadURL, fileResponse.Content.DownloadURL)
+
+ // Test updating a file with the wrong SHA
+ fileID++
+ treePath = fmt.Sprintf("update/file%d.txt", fileID)
+ createFile(user2, repo1, treePath)
+ updateFileOptions = getUpdateFileOptions()
+ correctSHA := updateFileOptions.SHA
+ updateFileOptions.SHA = "badsha"
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
+ resp = session.MakeRequest(t, req, http.StatusInternalServerError)
+ expectedAPIError := context.APIError{
+ Message: "sha does not match [given: " + updateFileOptions.SHA + ", expected: " + correctSHA + "]",
+ URL: base.DocURL,
+ }
+ var apiError context.APIError
+ DecodeJSON(t, resp, &apiError)
+ assert.Equal(t, expectedAPIError, apiError)
+
+ // Test creating a file in repo1 by user4 who does not have write access
+ fileID++
+ treePath = fmt.Sprintf("update/file%d.txt", fileID)
+ createFile(user2, repo16, treePath)
+ updateFileOptions = getUpdateFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token4)
+ req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
+ session.MakeRequest(t, req, http.StatusNotFound)
+
+ // Tests a repo with no token given so will fail
+ fileID++
+ treePath = fmt.Sprintf("update/file%d.txt", fileID)
+ createFile(user2, repo16, treePath)
+ updateFileOptions = getUpdateFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user2.Name, repo16.Name, treePath)
+ req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
+ session.MakeRequest(t, req, http.StatusNotFound)
+
+ // Test using access token for a private repo that the user of the token owns
+ fileID++
+ treePath = fmt.Sprintf("update/file%d.txt", fileID)
+ createFile(user2, repo16, treePath)
+ updateFileOptions = getUpdateFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo16.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
+ session.MakeRequest(t, req, http.StatusOK)
+
+ // Test using org repo "user3/repo3" where user2 is a collaborator
+ fileID++
+ treePath = fmt.Sprintf("update/file%d.txt", fileID)
+ createFile(user3, repo3, treePath)
+ updateFileOptions = getUpdateFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user3.Name, repo3.Name, treePath, token2)
+ req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
+ session.MakeRequest(t, req, http.StatusOK)
+
+ // Test using org repo "user3/repo3" with no user token
+ fileID++
+ treePath = fmt.Sprintf("update/file%d.txt", fileID)
+ createFile(user3, repo3, treePath)
+ updateFileOptions = getUpdateFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s", user3.Name, repo3.Name, treePath)
+ req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
+ session.MakeRequest(t, req, http.StatusNotFound)
+
+ // Test using repo "user2/repo1" where user4 is a NOT collaborator
+ fileID++
+ treePath = fmt.Sprintf("update/file%d.txt", fileID)
+ createFile(user2, repo1, treePath)
+ updateFileOptions = getUpdateFileOptions()
+ url = fmt.Sprintf("/api/v1/repos/%s/%s/contents/%s?token=%s", user2.Name, repo1.Name, treePath, token4)
+ req = NewRequestWithJSON(t, "PUT", url, &updateFileOptions)
+ session.MakeRequest(t, req, http.StatusForbidden)
+ })
}
diff --git a/integrations/editor_test.go b/integrations/editor_test.go
index e2dd2e1dc4..8e6effe7eb 100644
--- a/integrations/editor_test.go
+++ b/integrations/editor_test.go
@@ -7,6 +7,7 @@ package integrations
import (
"net/http"
"net/http/httptest"
+ "net/url"
"path"
"testing"
@@ -14,80 +15,79 @@ import (
)
func TestCreateFile(t *testing.T) {
- prepareTestEnv(t)
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ session := loginUser(t, "user2")
- session := loginUser(t, "user2")
+ // Request editor page
+ req := NewRequest(t, "GET", "/user2/repo1/_new/master/")
+ resp := session.MakeRequest(t, req, http.StatusOK)
- // Request editor page
- req := NewRequest(t, "GET", "/user2/repo1/_new/master/")
- resp := session.MakeRequest(t, req, http.StatusOK)
-
- doc := NewHTMLParser(t, resp.Body)
- lastCommit := doc.GetInputValueByName("last_commit")
- assert.NotEmpty(t, lastCommit)
+ 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",
+ // 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.StatusFound)
})
- resp = session.MakeRequest(t, req, http.StatusFound)
}
func TestCreateFileOnProtectedBranch(t *testing.T) {
- prepareTestEnv(t)
-
- session := loginUser(t, "user2")
-
- csrf := GetCSRF(t, session, "/user2/repo1/settings/branches")
- // Change master branch to protected
- req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/master", map[string]string{
- "_csrf": csrf,
- "protected": "on",
- })
- resp := session.MakeRequest(t, req, http.StatusFound)
- // Check if master branch has been locked successfully
- flashCookie := session.GetCookie("macaron_flash")
- assert.NotNil(t, flashCookie)
- assert.EqualValues(t, "success%3DBranch%2Bprotection%2Bfor%2Bbranch%2B%2527master%2527%2Bhas%2Bbeen%2Bupdated.", flashCookie.Value)
-
- // Request editor page
- req = NewRequest(t, "GET", "/user2/repo1/_new/master/")
- resp = session.MakeRequest(t, req, http.StatusOK)
-
- 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
- assert.Contains(t, resp.Body.String(), "Cannot commit to protected branch &#39;master&#39;.")
-
- // remove the protected branch
- csrf = GetCSRF(t, session, "/user2/repo1/settings/branches")
- // Change master branch to protected
- req = NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/master", map[string]string{
- "_csrf": csrf,
- "protected": "off",
+ 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
+ req := NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/master", map[string]string{
+ "_csrf": csrf,
+ "protected": "on",
+ })
+ resp := session.MakeRequest(t, req, http.StatusFound)
+ // Check if master branch has been locked successfully
+ flashCookie := session.GetCookie("macaron_flash")
+ assert.NotNil(t, flashCookie)
+ assert.EqualValues(t, "success%3DBranch%2Bprotection%2Bfor%2Bbranch%2B%2527master%2527%2Bhas%2Bbeen%2Bupdated.", flashCookie.Value)
+
+ // Request editor page
+ req = NewRequest(t, "GET", "/user2/repo1/_new/master/")
+ resp = session.MakeRequest(t, req, http.StatusOK)
+
+ 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
+ assert.Contains(t, resp.Body.String(), "Cannot commit to protected branch &#39;master&#39;.")
+
+ // remove the protected branch
+ csrf = GetCSRF(t, session, "/user2/repo1/settings/branches")
+ // Change master branch to protected
+ req = NewRequestWithValues(t, "POST", "/user2/repo1/settings/branches/master", map[string]string{
+ "_csrf": csrf,
+ "protected": "off",
+ })
+ resp = session.MakeRequest(t, req, http.StatusFound)
+ // Check if master branch has been locked successfully
+ flashCookie = session.GetCookie("macaron_flash")
+ assert.NotNil(t, flashCookie)
+ assert.EqualValues(t, "success%3DBranch%2Bprotection%2Bfor%2Bbranch%2B%2527master%2527%2Bhas%2Bbeen%2Bdisabled.", flashCookie.Value)
})
- resp = session.MakeRequest(t, req, http.StatusFound)
- // Check if master branch has been locked successfully
- flashCookie = session.GetCookie("macaron_flash")
- assert.NotNil(t, flashCookie)
- assert.EqualValues(t, "success%3DBranch%2Bprotection%2Bfor%2Bbranch%2B%2527master%2527%2Bhas%2Bbeen%2Bdisabled.", flashCookie.Value)
-
}
func testEditFile(t *testing.T, session *TestSession, user, repo, branch, filePath, newContent string) *httptest.ResponseRecorder {
@@ -151,13 +151,15 @@ func testEditFileToNewBranch(t *testing.T, session *TestSession, user, repo, bra
}
func TestEditFile(t *testing.T) {
- prepareTestEnv(t)
- session := loginUser(t, "user2")
- testEditFile(t, session, "user2", "repo1", "master", "README.md", "Hello, World (Edited)\n")
+ 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")
+ })
}
func TestEditFileToNewBranch(t *testing.T) {
- prepareTestEnv(t)
- session := loginUser(t, "user2")
- testEditFileToNewBranch(t, session, "user2", "repo1", "master", "feature/test", "README.md", "Hello, World (Edited)\n")
+ 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")
+ })
}
diff --git a/integrations/integration_test.go b/integrations/integration_test.go
index 566859518a..93dacaf78a 100644
--- a/integrations/integration_test.go
+++ b/integrations/integration_test.go
@@ -178,7 +178,6 @@ func prepareTestEnv(t testing.TB, skip ...int) {
assert.NoError(t, models.LoadFixtures())
assert.NoError(t, os.RemoveAll(setting.RepoRootPath))
assert.NoError(t, os.RemoveAll(models.LocalCopyPath()))
- assert.NoError(t, os.RemoveAll(models.LocalWikiPath()))
assert.NoError(t, com.CopyDir(path.Join(filepath.Dir(setting.AppPath), "integrations/gitea-repositories-meta"),
setting.RepoRootPath))
diff --git a/integrations/pull_create_test.go b/integrations/pull_create_test.go
index ed553bf162..8f39e8b028 100644
--- a/integrations/pull_create_test.go
+++ b/integrations/pull_create_test.go
@@ -7,6 +7,7 @@ package integrations
import (
"net/http"
"net/http/httptest"
+ "net/url"
"path"
"strings"
"testing"
@@ -43,63 +44,65 @@ func testPullCreate(t *testing.T, session *TestSession, user, repo, branch, titl
}
func TestPullCreate(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")
-
- // check the redirected URL
- url := resp.HeaderMap.Get("Location")
- assert.Regexp(t, "^/user2/repo1/pulls/[0-9]*$", url)
-
- // check .diff can be accessed and matches performed change
- req := NewRequest(t, "GET", url+".diff")
- resp = session.MakeRequest(t, req, http.StatusOK)
- assert.Regexp(t, `\+Hello, World \(Edited\)`, resp.Body)
- assert.Regexp(t, "^diff", resp.Body)
- assert.NotRegexp(t, "diff.*diff", resp.Body) // not two diffs, just one
-
- // check .patch can be accessed and matches performed change
- req = NewRequest(t, "GET", url+".patch")
- resp = session.MakeRequest(t, req, http.StatusOK)
- assert.Regexp(t, `\+Hello, World \(Edited\)`, resp.Body)
- assert.Regexp(t, "diff", resp.Body)
- assert.Regexp(t, `Subject: \[PATCH\] Update 'README.md'`, resp.Body)
- assert.NotRegexp(t, "diff.*diff", resp.Body) // not two diffs, just one
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ 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")
+
+ // check the redirected URL
+ url := resp.HeaderMap.Get("Location")
+ assert.Regexp(t, "^/user2/repo1/pulls/[0-9]*$", url)
+
+ // check .diff can be accessed and matches performed change
+ req := NewRequest(t, "GET", url+".diff")
+ resp = session.MakeRequest(t, req, http.StatusOK)
+ assert.Regexp(t, `\+Hello, World \(Edited\)`, resp.Body)
+ assert.Regexp(t, "^diff", resp.Body)
+ assert.NotRegexp(t, "diff.*diff", resp.Body) // not two diffs, just one
+
+ // check .patch can be accessed and matches performed change
+ req = NewRequest(t, "GET", url+".patch")
+ resp = session.MakeRequest(t, req, http.StatusOK)
+ assert.Regexp(t, `\+Hello, World \(Edited\)`, resp.Body)
+ assert.Regexp(t, "diff", resp.Body)
+ assert.Regexp(t, `Subject: \[PATCH\] Update 'README.md'`, resp.Body)
+ assert.NotRegexp(t, "diff.*diff", resp.Body) // not two diffs, just one
+ })
}
func TestPullCreate_TitleEscape(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", "<i>XSS PR</i>")
-
- // check the redirected URL
- url := resp.HeaderMap.Get("Location")
- assert.Regexp(t, "^/user2/repo1/pulls/[0-9]*$", url)
-
- // Edit title
- req := NewRequest(t, "GET", url)
- resp = session.MakeRequest(t, req, http.StatusOK)
- htmlDoc := NewHTMLParser(t, resp.Body)
- editTestTitleURL, exists := htmlDoc.doc.Find("#save-edit-title").First().Attr("data-update-url")
- assert.True(t, exists, "The template has changed")
-
- req = NewRequestWithValues(t, "POST", editTestTitleURL, map[string]string{
- "_csrf": htmlDoc.GetCSRF(),
- "title": "<u>XSS PR</u>",
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ 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", "<i>XSS PR</i>")
+
+ // check the redirected URL
+ url := resp.HeaderMap.Get("Location")
+ assert.Regexp(t, "^/user2/repo1/pulls/[0-9]*$", url)
+
+ // Edit title
+ req := NewRequest(t, "GET", url)
+ resp = session.MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ editTestTitleURL, exists := htmlDoc.doc.Find("#save-edit-title").First().Attr("data-update-url")
+ assert.True(t, exists, "The template has changed")
+
+ req = NewRequestWithValues(t, "POST", editTestTitleURL, map[string]string{
+ "_csrf": htmlDoc.GetCSRF(),
+ "title": "<u>XSS PR</u>",
+ })
+ session.MakeRequest(t, req, http.StatusOK)
+
+ req = NewRequest(t, "GET", url)
+ resp = session.MakeRequest(t, req, http.StatusOK)
+ htmlDoc = NewHTMLParser(t, resp.Body)
+ titleHTML, err := htmlDoc.doc.Find(".comments .event .text b").First().Html()
+ assert.NoError(t, err)
+ assert.Equal(t, "&lt;i&gt;XSS PR&lt;/i&gt;", titleHTML)
+ titleHTML, err = htmlDoc.doc.Find(".comments .event .text b").Next().Html()
+ assert.NoError(t, err)
+ assert.Equal(t, "&lt;u&gt;XSS PR&lt;/u&gt;", titleHTML)
})
- session.MakeRequest(t, req, http.StatusOK)
-
- req = NewRequest(t, "GET", url)
- resp = session.MakeRequest(t, req, http.StatusOK)
- htmlDoc = NewHTMLParser(t, resp.Body)
- titleHTML, err := htmlDoc.doc.Find(".comments .event .text b").First().Html()
- assert.NoError(t, err)
- assert.Equal(t, "&lt;i&gt;XSS PR&lt;/i&gt;", titleHTML)
- titleHTML, err = htmlDoc.doc.Find(".comments .event .text b").Next().Html()
- assert.NoError(t, err)
- assert.Equal(t, "&lt;u&gt;XSS PR&lt;/u&gt;", titleHTML)
}
diff --git a/integrations/pull_merge_test.go b/integrations/pull_merge_test.go
index f466515eb4..1f0ad27a0b 100644
--- a/integrations/pull_merge_test.go
+++ b/integrations/pull_merge_test.go
@@ -7,6 +7,7 @@ package integrations
import (
"net/http"
"net/http/httptest"
+ "net/url"
"path"
"strings"
"testing"
@@ -52,108 +53,118 @@ func testPullCleanUp(t *testing.T, session *TestSession, user, repo, pullnum str
}
func TestPullMerge(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")
+ onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
+ 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")
+ 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.MergeStyleMerge)
+ elem := strings.Split(test.RedirectURL(resp), "/")
+ assert.EqualValues(t, "pulls", elem[3])
+ 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")
+ onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
+ 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")
+ 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.MergeStyleRebase)
+ elem := strings.Split(test.RedirectURL(resp), "/")
+ assert.EqualValues(t, "pulls", elem[3])
+ testPullMerge(t, session, elem[1], elem[2], elem[4], models.MergeStyleRebase)
+ })
}
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")
+ onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
+ 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")
+ 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)
+ elem := strings.Split(test.RedirectURL(resp), "/")
+ assert.EqualValues(t, "pulls", elem[3])
+ testPullMerge(t, session, elem[1], elem[2], elem[4], models.MergeStyleRebaseMerge)
+ })
}
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")
-
- 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.MergeStyleSquash)
+ onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
+ 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")
+
+ 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.MergeStyleSquash)
+ })
}
func TestPullCleanUpAfterMerge(t *testing.T) {
- prepareTestEnv(t)
- session := loginUser(t, "user1")
- testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
- testEditFileToNewBranch(t, session, "user1", "repo1", "master", "feature/test", "README.md", "Hello, World (Edited)\n")
+ onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
+ prepareTestEnv(t)
+ session := loginUser(t, "user1")
+ testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
+ testEditFileToNewBranch(t, session, "user1", "repo1", "master", "feature/test", "README.md", "Hello, World (Edited)\n")
- resp := testPullCreate(t, session, "user1", "repo1", "feature/test", "This is a pull title")
+ resp := testPullCreate(t, session, "user1", "repo1", "feature/test", "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.MergeStyleMerge)
+ elem := strings.Split(test.RedirectURL(resp), "/")
+ assert.EqualValues(t, "pulls", elem[3])
+ testPullMerge(t, session, elem[1], elem[2], elem[4], models.MergeStyleMerge)
- // Check PR branch deletion
- resp = testPullCleanUp(t, session, elem[1], elem[2], elem[4])
- respJSON := struct {
- Redirect string
- }{}
- DecodeJSON(t, resp, &respJSON)
+ // 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")
+ assert.NotEmpty(t, respJSON.Redirect, "Redirected URL is not found")
- elem = strings.Split(respJSON.Redirect, "/")
- assert.EqualValues(t, "pulls", elem[3])
+ elem = strings.Split(respJSON.Redirect, "/")
+ assert.EqualValues(t, "pulls", elem[3])
- // Check branch deletion result
- req := NewRequest(t, "GET", respJSON.Redirect)
- resp = session.MakeRequest(t, req, http.StatusOK)
+ // Check branch deletion result
+ req := NewRequest(t, "GET", respJSON.Redirect)
+ resp = session.MakeRequest(t, req, http.StatusOK)
- htmlDoc := NewHTMLParser(t, resp.Body)
- resultMsg := htmlDoc.doc.Find(".ui.message>p").Text()
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ resultMsg := htmlDoc.doc.Find(".ui.message>p").Text()
- assert.EqualValues(t, "Branch 'user1/feature/test' has been deleted.", resultMsg)
+ assert.EqualValues(t, "Branch 'user1/feature/test' has been deleted.", resultMsg)
+ })
}
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")
+ onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
+ 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")
+ })
}
diff --git a/integrations/pull_status_test.go b/integrations/pull_status_test.go
index 2381444676..2a4d8e0b68 100644
--- a/integrations/pull_status_test.go
+++ b/integrations/pull_status_test.go
@@ -6,6 +6,7 @@ package integrations
import (
"fmt"
"net/http"
+ "net/url"
"path"
"testing"
@@ -16,78 +17,79 @@ import (
)
func TestPullCreate_CommitStatus(t *testing.T) {
- prepareTestEnv(t)
- session := loginUser(t, "user1")
- testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
- testEditFileToNewBranch(t, session, "user1", "repo1", "master", "status1", "README.md", "status1")
-
- url := path.Join("user1", "repo1", "compare", "master...status1")
- req := NewRequestWithValues(t, "POST", url,
- map[string]string{
- "_csrf": GetCSRF(t, session, url),
- "title": "pull request from status1",
- },
- )
- session.MakeRequest(t, req, http.StatusFound)
-
- req = NewRequest(t, "GET", "/user1/repo1/pulls")
- resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
-
- // Request repository commits page
- req = NewRequest(t, "GET", "/user1/repo1/pulls/1/commits")
- resp = session.MakeRequest(t, req, http.StatusOK)
- doc = NewHTMLParser(t, resp.Body)
-
- // Get first commit URL
- commitURL, exists := doc.doc.Find("#commits-table tbody tr td.sha a").Last().Attr("href")
- assert.True(t, exists)
- assert.NotEmpty(t, commitURL)
-
- commitID := path.Base(commitURL)
-
- statusList := []models.CommitStatusState{
- models.CommitStatusPending,
- models.CommitStatusError,
- models.CommitStatusFailure,
- models.CommitStatusWarning,
- models.CommitStatusSuccess,
- }
-
- statesIcons := map[models.CommitStatusState]string{
- models.CommitStatusPending: "circle icon yellow",
- models.CommitStatusSuccess: "check icon green",
- models.CommitStatusError: "warning icon red",
- models.CommitStatusFailure: "remove icon red",
- models.CommitStatusWarning: "warning sign icon yellow",
- }
-
- // Update commit status, and check if icon is updated as well
- for _, status := range statusList {
-
- // Call API to add status for commit
- token := getTokenForLoggedInUser(t, session)
- req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/user1/repo1/statuses/%s?token=%s", commitID, token),
- api.CreateStatusOption{
- State: api.StatusState(status),
- TargetURL: "http://test.ci/",
- Description: "",
- Context: "testci",
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ session := loginUser(t, "user1")
+ testRepoFork(t, session, "user2", "repo1", "user1", "repo1")
+ testEditFileToNewBranch(t, session, "user1", "repo1", "master", "status1", "README.md", "status1")
+
+ url := path.Join("user1", "repo1", "compare", "master...status1")
+ req := NewRequestWithValues(t, "POST", url,
+ map[string]string{
+ "_csrf": GetCSRF(t, session, url),
+ "title": "pull request from status1",
},
)
- session.MakeRequest(t, req, http.StatusCreated)
+ session.MakeRequest(t, req, http.StatusFound)
- req = NewRequestf(t, "GET", "/user1/repo1/pulls/1/commits")
+ req = NewRequest(t, "GET", "/user1/repo1/pulls")
+ resp := session.MakeRequest(t, req, http.StatusOK)
+ doc := NewHTMLParser(t, resp.Body)
+
+ // Request repository commits page
+ req = NewRequest(t, "GET", "/user1/repo1/pulls/1/commits")
resp = session.MakeRequest(t, req, http.StatusOK)
doc = NewHTMLParser(t, resp.Body)
- commitURL, exists = doc.doc.Find("#commits-table tbody tr td.sha a").Last().Attr("href")
+ // Get first commit URL
+ commitURL, exists := doc.doc.Find("#commits-table tbody tr td.sha a").Last().Attr("href")
assert.True(t, exists)
assert.NotEmpty(t, commitURL)
- assert.EqualValues(t, commitID, path.Base(commitURL))
- cls, ok := doc.doc.Find("#commits-table tbody tr td.message i.commit-status").Last().Attr("class")
- assert.True(t, ok)
- assert.EqualValues(t, "commit-status "+statesIcons[status], cls)
- }
+ commitID := path.Base(commitURL)
+
+ statusList := []models.CommitStatusState{
+ models.CommitStatusPending,
+ models.CommitStatusError,
+ models.CommitStatusFailure,
+ models.CommitStatusWarning,
+ models.CommitStatusSuccess,
+ }
+
+ statesIcons := map[models.CommitStatusState]string{
+ models.CommitStatusPending: "circle icon yellow",
+ models.CommitStatusSuccess: "check icon green",
+ models.CommitStatusError: "warning icon red",
+ models.CommitStatusFailure: "remove icon red",
+ models.CommitStatusWarning: "warning sign icon yellow",
+ }
+
+ // Update commit status, and check if icon is updated as well
+ for _, status := range statusList {
+
+ // Call API to add status for commit
+ token := getTokenForLoggedInUser(t, session)
+ req = NewRequestWithJSON(t, "POST", fmt.Sprintf("/api/v1/repos/user1/repo1/statuses/%s?token=%s", commitID, token),
+ api.CreateStatusOption{
+ State: api.StatusState(status),
+ TargetURL: "http://test.ci/",
+ Description: "",
+ Context: "testci",
+ },
+ )
+ session.MakeRequest(t, req, http.StatusCreated)
+
+ req = NewRequestf(t, "GET", "/user1/repo1/pulls/1/commits")
+ resp = session.MakeRequest(t, req, http.StatusOK)
+ doc = NewHTMLParser(t, resp.Body)
+
+ commitURL, exists = doc.doc.Find("#commits-table tbody tr td.sha a").Last().Attr("href")
+ assert.True(t, exists)
+ assert.NotEmpty(t, commitURL)
+ assert.EqualValues(t, commitID, path.Base(commitURL))
+
+ cls, ok := doc.doc.Find("#commits-table tbody tr td.message i.commit-status").Last().Attr("class")
+ assert.True(t, ok)
+ assert.EqualValues(t, "commit-status "+statesIcons[status], cls)
+ }
+ })
}
diff --git a/integrations/repo_activity_test.go b/integrations/repo_activity_test.go
index fcdbda2c89..cec5c79c4d 100644
--- a/integrations/repo_activity_test.go
+++ b/integrations/repo_activity_test.go
@@ -6,6 +6,7 @@ package integrations
import (
"net/http"
+ "net/url"
"strings"
"testing"
@@ -16,49 +17,51 @@ import (
)
func TestRepoActivity(t *testing.T) {
- prepareTestEnv(t)
- session := loginUser(t, "user1")
-
- // Create PRs (1 merged & 2 proposed)
- 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.MergeStyleMerge)
-
- testEditFileToNewBranch(t, session, "user1", "repo1", "master", "feat/better_readme", "README.md", "Hello, World (Edited Again)\n")
- testPullCreate(t, session, "user1", "repo1", "feat/better_readme", "This is a pull title")
-
- testEditFileToNewBranch(t, session, "user1", "repo1", "master", "feat/much_better_readme", "README.md", "Hello, World (Edited More)\n")
- testPullCreate(t, session, "user1", "repo1", "feat/much_better_readme", "This is a pull title")
-
- // Create issues (3 new issues)
- testNewIssue(t, session, "user2", "repo1", "Issue 1", "Description 1")
- testNewIssue(t, session, "user2", "repo1", "Issue 2", "Description 2")
- testNewIssue(t, session, "user2", "repo1", "Issue 3", "Description 3")
-
- // Create releases (1 new release)
- createNewRelease(t, session, "/user2/repo1", "v1.0.0", "v1.0.0", false, false)
-
- // Open Activity page and check stats
- req := NewRequest(t, "GET", "/user2/repo1/activity")
- resp = session.MakeRequest(t, req, http.StatusOK)
- htmlDoc := NewHTMLParser(t, resp.Body)
-
- // Should be 1 published release
- list := htmlDoc.doc.Find("#published-releases").Next().Find("p.desc")
- assert.Len(t, list.Nodes, 1)
-
- // Should be 1 merged pull request
- list = htmlDoc.doc.Find("#merged-pull-requests").Next().Find("p.desc")
- assert.Len(t, list.Nodes, 1)
-
- // Should be 2 merged proposed pull requests
- list = htmlDoc.doc.Find("#proposed-pull-requests").Next().Find("p.desc")
- assert.Len(t, list.Nodes, 2)
-
- // Should be 3 new issues
- list = htmlDoc.doc.Find("#new-issues").Next().Find("p.desc")
- assert.Len(t, list.Nodes, 3)
+ onGiteaRun(t, func(t *testing.T, giteaURL *url.URL) {
+
+ session := loginUser(t, "user1")
+
+ // Create PRs (1 merged & 2 proposed)
+ 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.MergeStyleMerge)
+
+ testEditFileToNewBranch(t, session, "user1", "repo1", "master", "feat/better_readme", "README.md", "Hello, World (Edited Again)\n")
+ testPullCreate(t, session, "user1", "repo1", "feat/better_readme", "This is a pull title")
+
+ testEditFileToNewBranch(t, session, "user1", "repo1", "master", "feat/much_better_readme", "README.md", "Hello, World (Edited More)\n")
+ testPullCreate(t, session, "user1", "repo1", "feat/much_better_readme", "This is a pull title")
+
+ // Create issues (3 new issues)
+ testNewIssue(t, session, "user2", "repo1", "Issue 1", "Description 1")
+ testNewIssue(t, session, "user2", "repo1", "Issue 2", "Description 2")
+ testNewIssue(t, session, "user2", "repo1", "Issue 3", "Description 3")
+
+ // Create releases (1 new release)
+ createNewRelease(t, session, "/user2/repo1", "v1.0.0", "v1.0.0", false, false)
+
+ // Open Activity page and check stats
+ req := NewRequest(t, "GET", "/user2/repo1/activity")
+ resp = session.MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+
+ // Should be 1 published release
+ list := htmlDoc.doc.Find("#published-releases").Next().Find("p.desc")
+ assert.Len(t, list.Nodes, 1)
+
+ // Should be 1 merged pull request
+ list = htmlDoc.doc.Find("#merged-pull-requests").Next().Find("p.desc")
+ assert.Len(t, list.Nodes, 1)
+
+ // Should be 2 merged proposed pull requests
+ list = htmlDoc.doc.Find("#proposed-pull-requests").Next().Find("p.desc")
+ assert.Len(t, list.Nodes, 2)
+
+ // Should be 3 new issues
+ list = htmlDoc.doc.Find("#new-issues").Next().Find("p.desc")
+ assert.Len(t, list.Nodes, 3)
+ })
}
diff --git a/integrations/repo_branch_test.go b/integrations/repo_branch_test.go
index 3101dc4c0f..a5447cfb66 100644
--- a/integrations/repo_branch_test.go
+++ b/integrations/repo_branch_test.go
@@ -6,6 +6,7 @@ package integrations
import (
"net/http"
+ "net/url"
"path"
"strings"
"testing"
@@ -35,6 +36,10 @@ func testCreateBranch(t testing.TB, session *TestSession, user, repo, oldRefSubU
}
func TestCreateBranch(t *testing.T) {
+ onGiteaRun(t, testCreateBranches)
+}
+
+func testCreateBranches(t *testing.T, giteaURL *url.URL) {
tests := []struct {
OldRefSubURL string
NewBranch string
diff --git a/integrations/repofiles_delete_test.go b/integrations/repofiles_delete_test.go
new file mode 100644
index 0000000000..c3bb18ec9c
--- /dev/null
+++ b/integrations/repofiles_delete_test.go
@@ -0,0 +1,193 @@
+// Copyright 2019 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/url"
+ "testing"
+
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/repofiles"
+ api "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/modules/test"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func getDeleteRepoFileOptions(repo *models.Repository) *repofiles.DeleteRepoFileOptions {
+ return &repofiles.DeleteRepoFileOptions{
+ LastCommitID: "",
+ OldBranch: repo.DefaultBranch,
+ NewBranch: repo.DefaultBranch,
+ TreePath: "README.md",
+ Message: "Deletes README.md",
+ SHA: "4b4851ad51df6a7d9f25c979345979eaeb5b349f",
+ Author: nil,
+ Committer: nil,
+ }
+}
+
+func getExpectedDeleteFileResponse(u *url.URL) *api.FileResponse {
+ return &api.FileResponse{
+ Content: nil,
+ Commit: &api.FileCommitResponse{
+ CommitMeta: api.CommitMeta{
+ URL: u.String() + "api/v1/repos/user2/repo1/git/commits/65f1bf27bc3bf70f64657658635e66094edbcb4d",
+ SHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d",
+ },
+ HTMLURL: u.String() + "user2/repo1/commit/65f1bf27bc3bf70f64657658635e66094edbcb4d",
+ Author: &api.CommitUser{
+ Identity: api.Identity{
+ Name: "user1",
+ Email: "address1@example.com",
+ },
+ Date: "2017-03-19T20:47:59Z",
+ },
+ Committer: &api.CommitUser{
+ Identity: api.Identity{
+ Name: "Ethan Koenig",
+ Email: "ethantkoenig@gmail.com",
+ },
+ Date: "2017-03-19T20:47:59Z",
+ },
+ Parents: []*api.CommitMeta{},
+ Message: "Initial commit\n",
+ Tree: &api.CommitMeta{
+ URL: u.String() + "api/v1/repos/user2/repo1/git/trees/2a2f1d4670728a2e10049e345bd7a276468beab6",
+ SHA: "2a2f1d4670728a2e10049e345bd7a276468beab6",
+ },
+ },
+ Verification: &api.PayloadCommitVerification{
+ Verified: false,
+ Reason: "",
+ Signature: "",
+ Payload: "",
+ },
+ }
+}
+
+func TestDeleteRepoFile(t *testing.T) {
+ onGiteaRun(t, testDeleteRepoFile)
+}
+
+func testDeleteRepoFile(t *testing.T, u *url.URL) {
+ // setup
+ models.PrepareTestEnv(t)
+ ctx := test.MockContext(t, "user2/repo1")
+ ctx.SetParams(":id", "1")
+ test.LoadRepo(t, ctx, 1)
+ test.LoadRepoCommit(t, ctx)
+ test.LoadUser(t, ctx, 2)
+ test.LoadGitRepo(t, ctx)
+ repo := ctx.Repo.Repository
+ doer := ctx.User
+ opts := getDeleteRepoFileOptions(repo)
+
+ t.Run("Delete README.md file", func(t *testing.T) {
+ fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
+ assert.Nil(t, err)
+ expectedFileResponse := getExpectedDeleteFileResponse(u)
+ assert.EqualValues(t, expectedFileResponse, fileResponse)
+ })
+
+ t.Run("Verify README.md has been deleted", func(t *testing.T) {
+ fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ expectedError := "repository file does not exist [path: " + opts.TreePath + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+}
+
+// Test opts with branch names removed, same results
+func TestDeleteRepoFileWithoutBranchNames(t *testing.T) {
+ onGiteaRun(t, testDeleteRepoFileWithoutBranchNames)
+}
+
+func testDeleteRepoFileWithoutBranchNames(t *testing.T, u *url.URL) {
+ // setup
+ models.PrepareTestEnv(t)
+ ctx := test.MockContext(t, "user2/repo1")
+ ctx.SetParams(":id", "1")
+ test.LoadRepo(t, ctx, 1)
+ test.LoadRepoCommit(t, ctx)
+ test.LoadUser(t, ctx, 2)
+ test.LoadGitRepo(t, ctx)
+ repo := ctx.Repo.Repository
+ doer := ctx.User
+ opts := getDeleteRepoFileOptions(repo)
+ opts.OldBranch = ""
+ opts.NewBranch = ""
+
+ t.Run("Delete README.md without Branch Name", func(t *testing.T) {
+ fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
+ assert.Nil(t, err)
+ expectedFileResponse := getExpectedDeleteFileResponse(u)
+ assert.EqualValues(t, expectedFileResponse, fileResponse)
+ })
+}
+
+func TestDeleteRepoFileErrors(t *testing.T) {
+ // setup
+ models.PrepareTestEnv(t)
+ ctx := test.MockContext(t, "user2/repo1")
+ ctx.SetParams(":id", "1")
+ test.LoadRepo(t, ctx, 1)
+ test.LoadRepoCommit(t, ctx)
+ test.LoadUser(t, ctx, 2)
+ test.LoadGitRepo(t, ctx)
+ repo := ctx.Repo.Repository
+ doer := ctx.User
+
+ t.Run("Bad branch", func(t *testing.T) {
+ opts := getDeleteRepoFileOptions(repo)
+ opts.OldBranch = "bad_branch"
+ fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
+ assert.Error(t, err)
+ assert.Nil(t, fileResponse)
+ expectedError := "branch does not exist [name: " + opts.OldBranch + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+
+ t.Run("Bad SHA", func(t *testing.T) {
+ opts := getDeleteRepoFileOptions(repo)
+ origSHA := opts.SHA
+ opts.SHA = "bad_sha"
+ fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ assert.Error(t, err)
+ expectedError := "sha does not match [given: " + opts.SHA + ", expected: " + origSHA + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+
+ t.Run("New branch already exists", func(t *testing.T) {
+ opts := getDeleteRepoFileOptions(repo)
+ opts.NewBranch = "develop"
+ fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ assert.Error(t, err)
+ expectedError := "branch already exists [name: " + opts.NewBranch + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+
+ t.Run("TreePath is empty:", func(t *testing.T) {
+ opts := getDeleteRepoFileOptions(repo)
+ opts.TreePath = ""
+ fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ assert.Error(t, err)
+ expectedError := "path contains a malformed path component [path: ]"
+ assert.EqualError(t, err, expectedError)
+ })
+
+ t.Run("TreePath is a git directory:", func(t *testing.T) {
+ opts := getDeleteRepoFileOptions(repo)
+ opts.TreePath = ".git"
+ fileResponse, err := repofiles.DeleteRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ assert.Error(t, err)
+ expectedError := "path contains a malformed path component [path: " + opts.TreePath + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+}
diff --git a/integrations/repofiles_update_test.go b/integrations/repofiles_update_test.go
new file mode 100644
index 0000000000..02a9bbeb16
--- /dev/null
+++ b/integrations/repofiles_update_test.go
@@ -0,0 +1,365 @@
+// Copyright 2019 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/url"
+ "testing"
+ "time"
+
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/repofiles"
+ "code.gitea.io/gitea/modules/setting"
+ api "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/modules/test"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func getCreateRepoFileOptions(repo *models.Repository) *repofiles.UpdateRepoFileOptions {
+ return &repofiles.UpdateRepoFileOptions{
+ OldBranch: repo.DefaultBranch,
+ NewBranch: repo.DefaultBranch,
+ TreePath: "new/file.txt",
+ Message: "Creates new/file.txt",
+ Content: "This is a NEW file",
+ IsNewFile: true,
+ Author: nil,
+ Committer: nil,
+ }
+}
+
+func getUpdateRepoFileOptions(repo *models.Repository) *repofiles.UpdateRepoFileOptions {
+ return &repofiles.UpdateRepoFileOptions{
+ OldBranch: repo.DefaultBranch,
+ NewBranch: repo.DefaultBranch,
+ TreePath: "README.md",
+ Message: "Updates README.md",
+ SHA: "4b4851ad51df6a7d9f25c979345979eaeb5b349f",
+ Content: "This is UPDATED content for the README file",
+ IsNewFile: false,
+ Author: nil,
+ Committer: nil,
+ }
+}
+
+func getExpectedFileResponseForRepofilesCreate(commitID string) *api.FileResponse {
+ return &api.FileResponse{
+ Content: &api.FileContentResponse{
+ Name: "file.txt",
+ Path: "new/file.txt",
+ SHA: "103ff9234cefeee5ec5361d22b49fbb04d385885",
+ Size: 18,
+ URL: setting.AppURL + "api/v1/repos/user2/repo1/contents/new/file.txt",
+ HTMLURL: setting.AppURL + "user2/repo1/blob/master/new/file.txt",
+ GitURL: setting.AppURL + "api/v1/repos/user2/repo1/git/blobs/103ff9234cefeee5ec5361d22b49fbb04d385885",
+ DownloadURL: setting.AppURL + "user2/repo1/raw/branch/master/new/file.txt",
+ Type: "blob",
+ Links: &api.FileLinksResponse{
+ Self: setting.AppURL + "api/v1/repos/user2/repo1/contents/new/file.txt",
+ GitURL: setting.AppURL + "api/v1/repos/user2/repo1/git/blobs/103ff9234cefeee5ec5361d22b49fbb04d385885",
+ HTMLURL: setting.AppURL + "user2/repo1/blob/master/new/file.txt",
+ },
+ },
+ Commit: &api.FileCommitResponse{
+ CommitMeta: api.CommitMeta{
+ URL: setting.AppURL + "api/v1/repos/user2/repo1/git/commits/" + commitID,
+ SHA: commitID,
+ },
+ HTMLURL: setting.AppURL + "user2/repo1/commit/" + commitID,
+ Author: &api.CommitUser{
+ Identity: api.Identity{
+ Name: "User Two",
+ Email: "user2@noreply.example.org",
+ },
+ Date: time.Now().UTC().Format(time.RFC3339),
+ },
+ Committer: &api.CommitUser{
+ Identity: api.Identity{
+ Name: "User Two",
+ Email: "user2@noreply.example.org",
+ },
+ Date: time.Now().UTC().Format(time.RFC3339),
+ },
+ Parents: []*api.CommitMeta{
+ {
+ URL: setting.AppURL + "api/v1/repos/user2/repo1/git/commits/65f1bf27bc3bf70f64657658635e66094edbcb4d",
+ SHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d",
+ },
+ },
+ Message: "Updates README.md\n",
+ Tree: &api.CommitMeta{
+ URL: setting.AppURL + "api/v1/repos/user2/repo1/git/trees/f93e3a1a1525fb5b91020da86e44810c87a2d7bc",
+ SHA: "f93e3a1a1525fb5b91020git dda86e44810c87a2d7bc",
+ },
+ },
+ Verification: &api.PayloadCommitVerification{
+ Verified: false,
+ Reason: "unsigned",
+ Signature: "",
+ Payload: "",
+ },
+ }
+}
+
+func getExpectedFileResponseForRepofilesUpdate(commitID string) *api.FileResponse {
+ return &api.FileResponse{
+ Content: &api.FileContentResponse{
+ Name: "README.md",
+ Path: "README.md",
+ SHA: "dbf8d00e022e05b7e5cf7e535de857de57925647",
+ Size: 43,
+ URL: setting.AppURL + "api/v1/repos/user2/repo1/contents/README.md",
+ HTMLURL: setting.AppURL + "user2/repo1/blob/master/README.md",
+ GitURL: setting.AppURL + "api/v1/repos/user2/repo1/git/blobs/dbf8d00e022e05b7e5cf7e535de857de57925647",
+ DownloadURL: setting.AppURL + "user2/repo1/raw/branch/master/README.md",
+ Type: "blob",
+ Links: &api.FileLinksResponse{
+ Self: setting.AppURL + "api/v1/repos/user2/repo1/contents/README.md",
+ GitURL: setting.AppURL + "api/v1/repos/user2/repo1/git/blobs/dbf8d00e022e05b7e5cf7e535de857de57925647",
+ HTMLURL: setting.AppURL + "user2/repo1/blob/master/README.md",
+ },
+ },
+ Commit: &api.FileCommitResponse{
+ CommitMeta: api.CommitMeta{
+ URL: setting.AppURL + "api/v1/repos/user2/repo1/git/commits/" + commitID,
+ SHA: commitID,
+ },
+ HTMLURL: setting.AppURL + "user2/repo1/commit/" + commitID,
+ Author: &api.CommitUser{
+ Identity: api.Identity{
+ Name: "User Two",
+ Email: "user2@noreply.example.org",
+ },
+ Date: time.Now().UTC().Format(time.RFC3339),
+ },
+ Committer: &api.CommitUser{
+ Identity: api.Identity{
+ Name: "User Two",
+ Email: "user2@noreply.example.org",
+ },
+ Date: time.Now().UTC().Format(time.RFC3339),
+ },
+ Parents: []*api.CommitMeta{
+ {
+ URL: setting.AppURL + "api/v1/repos/user2/repo1/git/commits/65f1bf27bc3bf70f64657658635e66094edbcb4d",
+ SHA: "65f1bf27bc3bf70f64657658635e66094edbcb4d",
+ },
+ },
+ Message: "Updates README.md\n",
+ Tree: &api.CommitMeta{
+ URL: setting.AppURL + "api/v1/repos/user2/repo1/git/trees/f93e3a1a1525fb5b91020da86e44810c87a2d7bc",
+ SHA: "f93e3a1a1525fb5b91020da86e44810c87a2d7bc",
+ },
+ },
+ Verification: &api.PayloadCommitVerification{
+ Verified: false,
+ Reason: "unsigned",
+ Signature: "",
+ Payload: "",
+ },
+ }
+}
+
+func TestCreateOrUpdateRepoFileForCreate(t *testing.T) {
+ // setup
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ ctx := test.MockContext(t, "user2/repo1")
+ ctx.SetParams(":id", "1")
+ test.LoadRepo(t, ctx, 1)
+ test.LoadRepoCommit(t, ctx)
+ test.LoadUser(t, ctx, 2)
+ test.LoadGitRepo(t, ctx)
+ repo := ctx.Repo.Repository
+ doer := ctx.User
+ opts := getCreateRepoFileOptions(repo)
+
+ // test
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+
+ // asserts
+ assert.Nil(t, err)
+ gitRepo, _ := git.OpenRepository(repo.RepoPath())
+ commitID, _ := gitRepo.GetBranchCommitID(opts.NewBranch)
+ expectedFileResponse := getExpectedFileResponseForRepofilesCreate(commitID)
+ assert.EqualValues(t, expectedFileResponse.Content, fileResponse.Content)
+ assert.EqualValues(t, expectedFileResponse.Commit.SHA, fileResponse.Commit.SHA)
+ assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, fileResponse.Commit.HTMLURL)
+ assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, fileResponse.Commit.Author.Email)
+ assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, fileResponse.Commit.Author.Name)
+ })
+}
+
+func TestCreateOrUpdateRepoFileForUpdate(t *testing.T) {
+ // setup
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ ctx := test.MockContext(t, "user2/repo1")
+ ctx.SetParams(":id", "1")
+ test.LoadRepo(t, ctx, 1)
+ test.LoadRepoCommit(t, ctx)
+ test.LoadUser(t, ctx, 2)
+ test.LoadGitRepo(t, ctx)
+ repo := ctx.Repo.Repository
+ doer := ctx.User
+ opts := getUpdateRepoFileOptions(repo)
+
+ // test
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+
+ // asserts
+ assert.Nil(t, err)
+ gitRepo, _ := git.OpenRepository(repo.RepoPath())
+ commitID, _ := gitRepo.GetBranchCommitID(opts.NewBranch)
+ expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commitID)
+ assert.EqualValues(t, expectedFileResponse.Content, fileResponse.Content)
+ assert.EqualValues(t, expectedFileResponse.Commit.SHA, fileResponse.Commit.SHA)
+ assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, fileResponse.Commit.HTMLURL)
+ assert.EqualValues(t, expectedFileResponse.Commit.Author.Email, fileResponse.Commit.Author.Email)
+ assert.EqualValues(t, expectedFileResponse.Commit.Author.Name, fileResponse.Commit.Author.Name)
+ })
+}
+
+func TestCreateOrUpdateRepoFileForUpdateWithFileMove(t *testing.T) {
+ // setup
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ ctx := test.MockContext(t, "user2/repo1")
+ ctx.SetParams(":id", "1")
+ test.LoadRepo(t, ctx, 1)
+ test.LoadRepoCommit(t, ctx)
+ test.LoadUser(t, ctx, 2)
+ test.LoadGitRepo(t, ctx)
+ repo := ctx.Repo.Repository
+ doer := ctx.User
+ opts := getUpdateRepoFileOptions(repo)
+ suffix := "_new"
+ opts.FromTreePath = "README.md"
+ opts.TreePath = "README.md" + suffix // new file name, README.md_new
+
+ // test
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+
+ // asserts
+ assert.Nil(t, err)
+ gitRepo, _ := git.OpenRepository(repo.RepoPath())
+ commit, _ := gitRepo.GetBranchCommit(opts.NewBranch)
+ expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commit.ID.String())
+ // assert that the old file no longer exists in the last commit of the branch
+ fromEntry, err := commit.GetTreeEntryByPath(opts.FromTreePath)
+ toEntry, err := commit.GetTreeEntryByPath(opts.TreePath)
+ assert.Nil(t, fromEntry) // Should no longer exist here
+ assert.NotNil(t, toEntry) // Should exist here
+ // assert SHA has remained the same but paths use the new file name
+ assert.EqualValues(t, expectedFileResponse.Content.SHA, fileResponse.Content.SHA)
+ assert.EqualValues(t, expectedFileResponse.Content.Name+suffix, fileResponse.Content.Name)
+ assert.EqualValues(t, expectedFileResponse.Content.Path+suffix, fileResponse.Content.Path)
+ assert.EqualValues(t, expectedFileResponse.Content.URL+suffix, fileResponse.Content.URL)
+ assert.EqualValues(t, expectedFileResponse.Commit.SHA, fileResponse.Commit.SHA)
+ assert.EqualValues(t, expectedFileResponse.Commit.HTMLURL, fileResponse.Commit.HTMLURL)
+ })
+}
+
+// Test opts with branch names removed, should get same results as above test
+func TestCreateOrUpdateRepoFileWithoutBranchNames(t *testing.T) {
+ // setup
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ ctx := test.MockContext(t, "user2/repo1")
+ ctx.SetParams(":id", "1")
+ test.LoadRepo(t, ctx, 1)
+ test.LoadRepoCommit(t, ctx)
+ test.LoadUser(t, ctx, 2)
+ test.LoadGitRepo(t, ctx)
+ repo := ctx.Repo.Repository
+ doer := ctx.User
+ opts := getUpdateRepoFileOptions(repo)
+ opts.OldBranch = ""
+ opts.NewBranch = ""
+
+ // test
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+
+ // asserts
+ assert.Nil(t, err)
+ gitRepo, _ := git.OpenRepository(repo.RepoPath())
+ commitID, _ := gitRepo.GetBranchCommitID(repo.DefaultBranch)
+ expectedFileResponse := getExpectedFileResponseForRepofilesUpdate(commitID)
+ assert.EqualValues(t, expectedFileResponse.Content, fileResponse.Content)
+ })
+}
+
+func TestCreateOrUpdateRepoFileErrors(t *testing.T) {
+ // setup
+ onGiteaRun(t, func(t *testing.T, u *url.URL) {
+ ctx := test.MockContext(t, "user2/repo1")
+ ctx.SetParams(":id", "1")
+ test.LoadRepo(t, ctx, 1)
+ test.LoadRepoCommit(t, ctx)
+ test.LoadUser(t, ctx, 2)
+ test.LoadGitRepo(t, ctx)
+ repo := ctx.Repo.Repository
+ doer := ctx.User
+
+ t.Run("bad branch", func(t *testing.T) {
+ opts := getUpdateRepoFileOptions(repo)
+ opts.OldBranch = "bad_branch"
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+ assert.Error(t, err)
+ assert.Nil(t, fileResponse)
+ expectedError := "branch does not exist [name: " + opts.OldBranch + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+
+ t.Run("bad SHA", func(t *testing.T) {
+ opts := getUpdateRepoFileOptions(repo)
+ origSHA := opts.SHA
+ opts.SHA = "bad_sha"
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ assert.Error(t, err)
+ expectedError := "sha does not match [given: " + opts.SHA + ", expected: " + origSHA + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+
+ t.Run("new branch already exists", func(t *testing.T) {
+ opts := getUpdateRepoFileOptions(repo)
+ opts.NewBranch = "develop"
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ assert.Error(t, err)
+ expectedError := "branch already exists [name: " + opts.NewBranch + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+
+ t.Run("treePath is empty:", func(t *testing.T) {
+ opts := getUpdateRepoFileOptions(repo)
+ opts.TreePath = ""
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ assert.Error(t, err)
+ expectedError := "path contains a malformed path component [path: ]"
+ assert.EqualError(t, err, expectedError)
+ })
+
+ t.Run("treePath is a git directory:", func(t *testing.T) {
+ opts := getUpdateRepoFileOptions(repo)
+ opts.TreePath = ".git"
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ assert.Error(t, err)
+ expectedError := "path contains a malformed path component [path: " + opts.TreePath + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+
+ t.Run("create file that already exists", func(t *testing.T) {
+ opts := getCreateRepoFileOptions(repo)
+ opts.TreePath = "README.md" //already exists
+ fileResponse, err := repofiles.CreateOrUpdateRepoFile(repo, doer, opts)
+ assert.Nil(t, fileResponse)
+ assert.Error(t, err)
+ expectedError := "repository file already exists [path: " + opts.TreePath + "]"
+ assert.EqualError(t, err, expectedError)
+ })
+ })
+}