99 "io"
1010 "mime/multipart"
1111 "net/http"
12+ "net/http/httptest"
1213 "net/url"
1314 "strings"
1415 "testing"
@@ -18,7 +19,9 @@ import (
1819 "code.gitea.io/gitea/models/unittest"
1920 user_model "code.gitea.io/gitea/models/user"
2021 "code.gitea.io/gitea/modules/gitrepo"
22+ "code.gitea.io/gitea/modules/setting"
2123 api "code.gitea.io/gitea/modules/structs"
24+ "code.gitea.io/gitea/modules/test"
2225 "code.gitea.io/gitea/tests"
2326
2427 "github.com/stretchr/testify/assert"
@@ -294,6 +297,7 @@ func TestAPIDeleteReleaseByTagName(t *testing.T) {
294297
295298func TestAPIUploadAssetRelease (t * testing.T ) {
296299 defer tests .PrepareTestEnv (t )()
300+ defer test .MockVariableValue (& setting .Attachment .MaxSize , 1 )()
297301
298302 repo := unittest .AssertExistsAndLoadBean (t , & repo_model.Repository {ID : 1 })
299303 owner := unittest .AssertExistsAndLoadBean (t , & user_model.User {ID : repo .OwnerID })
@@ -303,56 +307,59 @@ func TestAPIUploadAssetRelease(t *testing.T) {
303307 r := createNewReleaseUsingAPI (t , token , owner , repo , "release-tag" , "" , "Release Tag" , "test" )
304308
305309 filename := "image.png"
306- buff := generateImg ()
310+ bufImage := generateImg ()
311+ bufLargeBytes := bytes .Repeat ([]byte {' ' }, 2 * 1024 * 1024 )
307312
308313 assetURL := fmt .Sprintf ("/api/v1/repos/%s/%s/releases/%d/assets" , owner .Name , repo .Name , r .ID )
309314
310315 t .Run ("multipart/form-data" , func (t * testing.T ) {
311316 defer tests .PrintCurrentTest (t )()
312317
313- body := & bytes.Buffer {}
314-
315- writer := multipart .NewWriter (body )
316- part , err := writer .CreateFormFile ("attachment" , filename )
317- assert .NoError (t , err )
318- _ , err = io .Copy (part , bytes .NewReader (buff .Bytes ()))
319- assert .NoError (t , err )
320- err = writer .Close ()
321- assert .NoError (t , err )
322-
323- req := NewRequestWithBody (t , http .MethodPost , assetURL , bytes .NewReader (body .Bytes ())).
324- AddTokenAuth (token ).
325- SetHeader ("Content-Type" , writer .FormDataContentType ())
326- resp := MakeRequest (t , req , http .StatusCreated )
327-
328- var attachment * api.Attachment
329- DecodeJSON (t , resp , & attachment )
330-
331- assert .Equal (t , filename , attachment .Name )
332- assert .EqualValues (t , 104 , attachment .Size )
333-
334- req = NewRequestWithBody (t , http .MethodPost , assetURL + "?name=test-asset" , bytes .NewReader (body .Bytes ())).
335- AddTokenAuth (token ).
336- SetHeader ("Content-Type" , writer .FormDataContentType ())
337- resp = MakeRequest (t , req , http .StatusCreated )
338-
339- var attachment2 * api.Attachment
340- DecodeJSON (t , resp , & attachment2 )
318+ performUpload := func (t * testing.T , uploadURL string , buf []byte , expectedStatus int ) * httptest.ResponseRecorder {
319+ body := & bytes.Buffer {}
320+ writer := multipart .NewWriter (body )
321+ part , err := writer .CreateFormFile ("attachment" , filename )
322+ assert .NoError (t , err )
323+ _ , err = io .Copy (part , bytes .NewReader (bufImage .Bytes ()))
324+ assert .NoError (t , err )
325+ err = writer .Close ()
326+ assert .NoError (t , err )
327+
328+ req := NewRequestWithBody (t , http .MethodPost , uploadURL , bytes .NewReader (body .Bytes ())).
329+ AddTokenAuth (token ).
330+ SetHeader ("Content-Type" , writer .FormDataContentType ())
331+ return MakeRequest (t , req , http .StatusCreated )
332+ }
341333
342- assert .Equal (t , "test-asset" , attachment2 .Name )
343- assert .EqualValues (t , 104 , attachment2 .Size )
334+ performUpload (t , assetURL , bufLargeBytes , http .StatusRequestEntityTooLarge )
335+
336+ t .Run ("UploadDefaultName" , func (t * testing.T ) {
337+ resp := performUpload (t , assetURL , bufImage .Bytes (), http .StatusCreated )
338+ var attachment api.Attachment
339+ DecodeJSON (t , resp , & attachment )
340+ assert .Equal (t , filename , attachment .Name )
341+ assert .EqualValues (t , 104 , attachment .Size )
342+ })
343+ t .Run ("UploadWithName" , func (t * testing.T ) {
344+ resp := performUpload (t , assetURL + "?name=test-asset" , bufImage .Bytes (), http .StatusCreated )
345+ var attachment api.Attachment
346+ DecodeJSON (t , resp , & attachment )
347+ assert .Equal (t , "test-asset" , attachment .Name )
348+ assert .EqualValues (t , 104 , attachment .Size )
349+ })
344350 })
345351
346352 t .Run ("application/octet-stream" , func (t * testing.T ) {
347353 defer tests .PrintCurrentTest (t )()
348354
349- req := NewRequestWithBody (t , http .MethodPost , assetURL , bytes .NewReader (buff .Bytes ())).
350- AddTokenAuth (token )
355+ req := NewRequestWithBody (t , http .MethodPost , assetURL , bytes .NewReader (bufImage .Bytes ())).AddTokenAuth (token )
351356 MakeRequest (t , req , http .StatusBadRequest )
352357
353- req = NewRequestWithBody (t , http .MethodPost , assetURL + "?name=stream.bin" , bytes .NewReader (buff .Bytes ())).
354- AddTokenAuth (token )
355- resp := MakeRequest (t , req , http .StatusCreated )
358+ req = NewRequestWithBody (t , http .MethodPost , assetURL + "?name=stream.bin" , bytes .NewReader (bufLargeBytes )).AddTokenAuth (token )
359+ resp := MakeRequest (t , req , http .StatusRequestEntityTooLarge )
360+
361+ req = NewRequestWithBody (t , http .MethodPost , assetURL + "?name=stream.bin" , bytes .NewReader (bufImage .Bytes ())).AddTokenAuth (token )
362+ resp = MakeRequest (t , req , http .StatusCreated )
356363
357364 var attachment * api.Attachment
358365 DecodeJSON (t , resp , & attachment )
0 commit comments