2022-03-30 10:42:47 +02:00
// Copyright 2021 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.
2022-09-02 15:18:23 -04:00
package integration
2022-03-30 10:42:47 +02:00
import (
"bytes"
"fmt"
"net/http"
"testing"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/packages"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
2022-09-21 15:01:18 +02:00
"code.gitea.io/gitea/modules/setting"
2022-09-02 15:18:23 -04:00
"code.gitea.io/gitea/tests"
2022-03-30 10:42:47 +02:00
"github.com/stretchr/testify/assert"
)
func TestPackageGeneric ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrepareTestEnv ( t ) ( )
2022-08-16 10:22:25 +08:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
2022-03-30 10:42:47 +02:00
packageName := "te-st_pac.kage"
2022-08-09 06:39:24 +02:00
packageVersion := "1.0.3-te st"
2022-03-30 10:42:47 +02:00
filename := "fi-le_na.me"
content := [ ] byte { 1 , 2 , 3 }
2022-08-09 06:39:24 +02:00
url := fmt . Sprintf ( "/api/packages/%s/generic/%s/%s" , user . Name , packageName , packageVersion )
2022-03-30 10:42:47 +02:00
t . Run ( "Upload" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 10:42:47 +02:00
2022-08-09 06:39:24 +02:00
req := NewRequestWithBody ( t , "PUT" , url + "/" + filename , bytes . NewReader ( content ) )
2022-03-30 10:42:47 +02:00
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusCreated )
pvs , err := packages . GetVersionsByPackageType ( db . DefaultContext , user . ID , packages . TypeGeneric )
assert . NoError ( t , err )
assert . Len ( t , pvs , 1 )
pd , err := packages . GetPackageDescriptor ( db . DefaultContext , pvs [ 0 ] )
assert . NoError ( t , err )
assert . Nil ( t , pd . Metadata )
assert . Equal ( t , packageName , pd . Package . Name )
assert . Equal ( t , packageVersion , pd . Version . Version )
pfs , err := packages . GetFilesByVersionID ( db . DefaultContext , pvs [ 0 ] . ID )
assert . NoError ( t , err )
assert . Len ( t , pfs , 1 )
assert . Equal ( t , filename , pfs [ 0 ] . Name )
assert . True ( t , pfs [ 0 ] . IsLead )
pb , err := packages . GetBlobByID ( db . DefaultContext , pfs [ 0 ] . BlobID )
assert . NoError ( t , err )
assert . Equal ( t , int64 ( len ( content ) ) , pb . Size )
2022-08-09 06:39:24 +02:00
t . Run ( "Exists" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 10:42:47 +02:00
2022-08-09 06:39:24 +02:00
req := NewRequestWithBody ( t , "PUT" , url + "/" + filename , bytes . NewReader ( content ) )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusConflict )
} )
t . Run ( "Additional" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 06:39:24 +02:00
req := NewRequestWithBody ( t , "PUT" , url + "/dummy.bin" , bytes . NewReader ( content ) )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusCreated )
// Check deduplication
pfs , err := packages . GetFilesByVersionID ( db . DefaultContext , pvs [ 0 ] . ID )
assert . NoError ( t , err )
assert . Len ( t , pfs , 2 )
assert . Equal ( t , pfs [ 0 ] . BlobID , pfs [ 1 ] . BlobID )
} )
t . Run ( "InvalidParameter" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 06:39:24 +02:00
req := NewRequestWithBody ( t , "PUT" , fmt . Sprintf ( "/api/packages/%s/generic/%s/%s/%s" , user . Name , "invalid+package name" , packageVersion , filename ) , bytes . NewReader ( content ) )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusBadRequest )
req = NewRequestWithBody ( t , "PUT" , fmt . Sprintf ( "/api/packages/%s/generic/%s/%s/%s" , user . Name , packageName , "%20test " , filename ) , bytes . NewReader ( content ) )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusBadRequest )
req = NewRequestWithBody ( t , "PUT" , fmt . Sprintf ( "/api/packages/%s/generic/%s/%s/%s" , user . Name , packageName , packageVersion , "inval+id.na me" ) , bytes . NewReader ( content ) )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusBadRequest )
} )
2022-03-30 10:42:47 +02:00
} )
t . Run ( "Download" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 10:42:47 +02:00
2022-08-09 06:39:24 +02:00
checkDownloadCount := func ( count int64 ) {
pvs , err := packages . GetVersionsByPackageType ( db . DefaultContext , user . ID , packages . TypeGeneric )
assert . NoError ( t , err )
assert . Len ( t , pvs , 1 )
assert . Equal ( t , count , pvs [ 0 ] . DownloadCount )
}
checkDownloadCount ( 0 )
req := NewRequest ( t , "GET" , url + "/" + filename )
2022-03-30 10:42:47 +02:00
resp := MakeRequest ( t , req , http . StatusOK )
assert . Equal ( t , content , resp . Body . Bytes ( ) )
2022-08-09 06:39:24 +02:00
checkDownloadCount ( 1 )
req = NewRequest ( t , "GET" , url + "/dummy.bin" )
MakeRequest ( t , req , http . StatusOK )
checkDownloadCount ( 2 )
t . Run ( "NotExists" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 06:39:24 +02:00
req := NewRequest ( t , "GET" , url + "/not.found" )
MakeRequest ( t , req , http . StatusNotFound )
} )
2022-09-21 15:01:18 +02:00
t . Run ( "RequireSignInView" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
setting . Service . RequireSignInView = true
defer func ( ) {
setting . Service . RequireSignInView = false
} ( )
req = NewRequest ( t , "GET" , url + "/dummy.bin" )
MakeRequest ( t , req , http . StatusUnauthorized )
} )
2022-03-30 10:42:47 +02:00
} )
t . Run ( "Delete" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 10:42:47 +02:00
2022-08-09 06:39:24 +02:00
t . Run ( "File" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 10:42:47 +02:00
2022-08-09 06:39:24 +02:00
req := NewRequest ( t , "DELETE" , url + "/" + filename )
MakeRequest ( t , req , http . StatusUnauthorized )
2022-03-30 10:42:47 +02:00
2022-08-09 06:39:24 +02:00
req = NewRequest ( t , "DELETE" , url + "/" + filename )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusNoContent )
2022-03-30 10:42:47 +02:00
2022-08-09 06:39:24 +02:00
req = NewRequest ( t , "GET" , url + "/" + filename )
MakeRequest ( t , req , http . StatusNotFound )
2022-03-30 10:42:47 +02:00
2022-08-09 06:39:24 +02:00
req = NewRequest ( t , "DELETE" , url + "/" + filename )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusNotFound )
2022-03-30 10:42:47 +02:00
2022-08-09 06:39:24 +02:00
pvs , err := packages . GetVersionsByPackageType ( db . DefaultContext , user . ID , packages . TypeGeneric )
assert . NoError ( t , err )
assert . Len ( t , pvs , 1 )
t . Run ( "RemovesVersion" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 06:39:24 +02:00
req = NewRequest ( t , "DELETE" , url + "/dummy.bin" )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusNoContent )
pvs , err := packages . GetVersionsByPackageType ( db . DefaultContext , user . ID , packages . TypeGeneric )
assert . NoError ( t , err )
assert . Empty ( t , pvs )
} )
} )
t . Run ( "Version" , func ( t * testing . T ) {
2022-09-02 15:18:23 -04:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 06:39:24 +02:00
req := NewRequestWithBody ( t , "PUT" , url + "/" + filename , bytes . NewReader ( content ) )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusCreated )
req = NewRequest ( t , "DELETE" , url )
MakeRequest ( t , req , http . StatusUnauthorized )
req = NewRequest ( t , "DELETE" , url )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusNoContent )
pvs , err := packages . GetVersionsByPackageType ( db . DefaultContext , user . ID , packages . TypeGeneric )
assert . NoError ( t , err )
assert . Empty ( t , pvs )
req = NewRequest ( t , "GET" , url + "/" + filename )
MakeRequest ( t , req , http . StatusNotFound )
req = NewRequest ( t , "DELETE" , url )
AddBasicAuthHeader ( req , user . Name )
MakeRequest ( t , req , http . StatusNotFound )
} )
2022-03-30 10:42:47 +02:00
} )
}