code.gitea.io/gitea@v1.22.3/tests/integration/empty_repo_test.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package integration
     5  
     6  import (
     7  	"bytes"
     8  	"encoding/base64"
     9  	"fmt"
    10  	"io"
    11  	"mime/multipart"
    12  	"net/http"
    13  	"net/http/httptest"
    14  	"testing"
    15  
    16  	auth_model "code.gitea.io/gitea/models/auth"
    17  	repo_model "code.gitea.io/gitea/models/repo"
    18  	"code.gitea.io/gitea/models/unittest"
    19  	user_model "code.gitea.io/gitea/models/user"
    20  	"code.gitea.io/gitea/modules/json"
    21  	"code.gitea.io/gitea/modules/setting"
    22  	api "code.gitea.io/gitea/modules/structs"
    23  	"code.gitea.io/gitea/modules/test"
    24  	"code.gitea.io/gitea/tests"
    25  
    26  	"github.com/stretchr/testify/assert"
    27  )
    28  
    29  func testAPINewFile(t *testing.T, session *TestSession, user, repo, branch, treePath, content string) *httptest.ResponseRecorder {
    30  	url := fmt.Sprintf("/%s/%s/_new/%s", user, repo, branch)
    31  	req := NewRequestWithValues(t, "POST", url, map[string]string{
    32  		"_csrf":         GetCSRF(t, session, "/user/settings"),
    33  		"commit_choice": "direct",
    34  		"tree_path":     treePath,
    35  		"content":       content,
    36  	})
    37  	return session.MakeRequest(t, req, http.StatusSeeOther)
    38  }
    39  
    40  func TestEmptyRepo(t *testing.T) {
    41  	defer tests.PrepareTestEnv(t)()
    42  	subPaths := []string{
    43  		"commits/master",
    44  		"raw/foo",
    45  		"commit/1ae57b34ccf7e18373",
    46  		"graph",
    47  	}
    48  	emptyRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 6})
    49  	assert.True(t, emptyRepo.IsEmpty)
    50  	owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: emptyRepo.OwnerID})
    51  	for _, subPath := range subPaths {
    52  		req := NewRequestf(t, "GET", "/%s/%s/%s", owner.Name, emptyRepo.Name, subPath)
    53  		MakeRequest(t, req, http.StatusNotFound)
    54  	}
    55  }
    56  
    57  func TestEmptyRepoAddFile(t *testing.T) {
    58  	defer tests.PrepareTestEnv(t)()
    59  
    60  	session := loginUser(t, "user30")
    61  	req := NewRequest(t, "GET", "/user30/empty/_new/"+setting.Repository.DefaultBranch)
    62  	resp := session.MakeRequest(t, req, http.StatusOK)
    63  	doc := NewHTMLParser(t, resp.Body).Find(`input[name="commit_choice"]`)
    64  	assert.Empty(t, doc.AttrOr("checked", "_no_"))
    65  	req = NewRequestWithValues(t, "POST", "/user30/empty/_new/"+setting.Repository.DefaultBranch, map[string]string{
    66  		"_csrf":         GetCSRF(t, session, "/user/settings"),
    67  		"commit_choice": "direct",
    68  		"tree_path":     "test-file.md",
    69  		"content":       "newly-added-test-file",
    70  	})
    71  
    72  	resp = session.MakeRequest(t, req, http.StatusSeeOther)
    73  	redirect := test.RedirectURL(resp)
    74  	assert.Equal(t, "/user30/empty/src/branch/"+setting.Repository.DefaultBranch+"/test-file.md", redirect)
    75  
    76  	req = NewRequest(t, "GET", redirect)
    77  	resp = session.MakeRequest(t, req, http.StatusOK)
    78  	assert.Contains(t, resp.Body.String(), "newly-added-test-file")
    79  }
    80  
    81  func TestEmptyRepoUploadFile(t *testing.T) {
    82  	defer tests.PrepareTestEnv(t)()
    83  
    84  	session := loginUser(t, "user30")
    85  	req := NewRequest(t, "GET", "/user30/empty/_new/"+setting.Repository.DefaultBranch)
    86  	resp := session.MakeRequest(t, req, http.StatusOK)
    87  	doc := NewHTMLParser(t, resp.Body).Find(`input[name="commit_choice"]`)
    88  	assert.Empty(t, doc.AttrOr("checked", "_no_"))
    89  
    90  	body := &bytes.Buffer{}
    91  	mpForm := multipart.NewWriter(body)
    92  	_ = mpForm.WriteField("_csrf", GetCSRF(t, session, "/user/settings"))
    93  	file, _ := mpForm.CreateFormFile("file", "uploaded-file.txt")
    94  	_, _ = io.Copy(file, bytes.NewBufferString("newly-uploaded-test-file"))
    95  	_ = mpForm.Close()
    96  
    97  	req = NewRequestWithBody(t, "POST", "/user30/empty/upload-file", body)
    98  	req.Header.Add("Content-Type", mpForm.FormDataContentType())
    99  	resp = session.MakeRequest(t, req, http.StatusOK)
   100  	respMap := map[string]string{}
   101  	assert.NoError(t, json.Unmarshal(resp.Body.Bytes(), &respMap))
   102  
   103  	req = NewRequestWithValues(t, "POST", "/user30/empty/_upload/"+setting.Repository.DefaultBranch, map[string]string{
   104  		"_csrf":         GetCSRF(t, session, "/user/settings"),
   105  		"commit_choice": "direct",
   106  		"files":         respMap["uuid"],
   107  		"tree_path":     "",
   108  	})
   109  	resp = session.MakeRequest(t, req, http.StatusSeeOther)
   110  	redirect := test.RedirectURL(resp)
   111  	assert.Equal(t, "/user30/empty/src/branch/"+setting.Repository.DefaultBranch+"/", redirect)
   112  
   113  	req = NewRequest(t, "GET", redirect)
   114  	resp = session.MakeRequest(t, req, http.StatusOK)
   115  	assert.Contains(t, resp.Body.String(), "uploaded-file.txt")
   116  }
   117  
   118  func TestEmptyRepoAddFileByAPI(t *testing.T) {
   119  	defer tests.PrepareTestEnv(t)()
   120  
   121  	session := loginUser(t, "user30")
   122  	token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
   123  
   124  	req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user30/empty/contents/new-file.txt", &api.CreateFileOptions{
   125  		FileOptions: api.FileOptions{
   126  			NewBranchName: "new_branch",
   127  			Message:       "init",
   128  		},
   129  		ContentBase64: base64.StdEncoding.EncodeToString([]byte("newly-added-api-file")),
   130  	}).AddTokenAuth(token)
   131  
   132  	resp := MakeRequest(t, req, http.StatusCreated)
   133  	var fileResponse api.FileResponse
   134  	DecodeJSON(t, resp, &fileResponse)
   135  	expectedHTMLURL := setting.AppURL + "user30/empty/src/branch/new_branch/new-file.txt"
   136  	assert.EqualValues(t, expectedHTMLURL, *fileResponse.Content.HTMLURL)
   137  
   138  	req = NewRequest(t, "GET", "/user30/empty/src/branch/new_branch/new-file.txt")
   139  	resp = session.MakeRequest(t, req, http.StatusOK)
   140  	assert.Contains(t, resp.Body.String(), "newly-added-api-file")
   141  
   142  	req = NewRequest(t, "GET", "/api/v1/repos/user30/empty").
   143  		AddTokenAuth(token)
   144  	resp = session.MakeRequest(t, req, http.StatusOK)
   145  	var apiRepo api.Repository
   146  	DecodeJSON(t, resp, &apiRepo)
   147  	assert.Equal(t, "new_branch", apiRepo.DefaultBranch)
   148  }