2022-03-30 11:42:47 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2022-03-30 11:42:47 +03:00
2022-09-02 22:18:23 +03:00
package integration
2022-03-30 11:42:47 +03:00
import (
"bytes"
"fmt"
2023-07-03 16:33:28 +03:00
"io"
2022-03-30 11:42:47 +03:00
"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 16:01:18 +03:00
"code.gitea.io/gitea/modules/setting"
2022-09-02 22:18:23 +03:00
"code.gitea.io/gitea/tests"
2022-03-30 11:42:47 +03:00
"github.com/stretchr/testify/assert"
)
func TestPackageGeneric ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrepareTestEnv ( t ) ( )
2023-02-23 17:11:56 +03:00
2022-08-16 05:22:25 +03:00
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
2022-03-30 11:42:47 +03:00
packageName := "te-st_pac.kage"
2022-08-09 07:39:24 +03:00
packageVersion := "1.0.3-te st"
2022-03-30 11:42:47 +03:00
filename := "fi-le_na.me"
content := [ ] byte { 1 , 2 , 3 }
2022-08-09 07:39:24 +03:00
url := fmt . Sprintf ( "/api/packages/%s/generic/%s/%s" , user . Name , packageName , packageVersion )
2022-03-30 11:42:47 +03:00
t . Run ( "Upload" , func ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 11:42:47 +03:00
2023-12-22 02:59:59 +03:00
req := NewRequestWithBody ( t , "PUT" , url + "/" + filename , bytes . NewReader ( content ) ) .
AddBasicAuth ( user . Name )
2022-03-30 11:42:47 +03:00
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 07:39:24 +03:00
t . Run ( "Exists" , func ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 11:42:47 +03:00
2023-12-22 02:59:59 +03:00
req := NewRequestWithBody ( t , "PUT" , url + "/" + filename , bytes . NewReader ( content ) ) .
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
MakeRequest ( t , req , http . StatusConflict )
} )
t . Run ( "Additional" , func ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 07:39:24 +03:00
2023-12-22 02:59:59 +03:00
req := NewRequestWithBody ( t , "PUT" , url + "/dummy.bin" , bytes . NewReader ( content ) ) .
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
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 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 07:39:24 +03:00
2024-03-27 19:55:05 +03:00
req := NewRequestWithBody ( t , "PUT" , fmt . Sprintf ( "/api/packages/%s/generic/%s/%s/%s" , user . Name , "invalid package name" , packageVersion , filename ) , bytes . NewReader ( content ) ) .
2023-12-22 02:59:59 +03:00
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
MakeRequest ( t , req , http . StatusBadRequest )
2023-12-22 02:59:59 +03:00
req = NewRequestWithBody ( t , "PUT" , fmt . Sprintf ( "/api/packages/%s/generic/%s/%s/%s" , user . Name , packageName , "%20test " , filename ) , bytes . NewReader ( content ) ) .
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
MakeRequest ( t , req , http . StatusBadRequest )
2024-03-27 19:55:05 +03:00
req = NewRequestWithBody ( t , "PUT" , fmt . Sprintf ( "/api/packages/%s/generic/%s/%s/%s" , user . Name , packageName , packageVersion , "inva|id.name" ) , bytes . NewReader ( content ) ) .
2023-12-22 02:59:59 +03:00
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
MakeRequest ( t , req , http . StatusBadRequest )
} )
2022-03-30 11:42:47 +03:00
} )
t . Run ( "Download" , func ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 11:42:47 +03:00
2022-08-09 07:39:24 +03: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 11:42:47 +03:00
resp := MakeRequest ( t , req , http . StatusOK )
assert . Equal ( t , content , resp . Body . Bytes ( ) )
2022-08-09 07:39:24 +03: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 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 07:39:24 +03:00
req := NewRequest ( t , "GET" , url + "/not.found" )
MakeRequest ( t , req , http . StatusNotFound )
} )
2022-09-21 16:01:18 +03: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 )
} )
2023-07-03 16:33:28 +03:00
t . Run ( "ServeDirect" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
if setting . Packages . Storage . Type != setting . MinioStorageType {
t . Skip ( "Test skipped for non-Minio-storage." )
return
}
if ! setting . Packages . Storage . MinioConfig . ServeDirect {
old := setting . Packages . Storage . MinioConfig . ServeDirect
defer func ( ) {
setting . Packages . Storage . MinioConfig . ServeDirect = old
} ( )
setting . Packages . Storage . MinioConfig . ServeDirect = true
}
req := NewRequest ( t , "GET" , url + "/" + filename )
resp := MakeRequest ( t , req , http . StatusSeeOther )
checkDownloadCount ( 3 )
location := resp . Header ( ) . Get ( "Location" )
assert . NotEmpty ( t , location )
resp2 , err := ( & http . Client { } ) . Get ( location )
assert . NoError ( t , err )
assert . Equal ( t , http . StatusOK , resp2 . StatusCode )
body , err := io . ReadAll ( resp2 . Body )
assert . NoError ( t , err )
assert . Equal ( t , content , body )
checkDownloadCount ( 3 )
} )
2022-03-30 11:42:47 +03:00
} )
t . Run ( "Delete" , func ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 11:42:47 +03:00
2022-08-09 07:39:24 +03:00
t . Run ( "File" , func ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 11:42:47 +03:00
2022-08-09 07:39:24 +03:00
req := NewRequest ( t , "DELETE" , url + "/" + filename )
MakeRequest ( t , req , http . StatusUnauthorized )
2022-03-30 11:42:47 +03:00
2023-12-22 02:59:59 +03:00
req = NewRequest ( t , "DELETE" , url + "/" + filename ) .
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
MakeRequest ( t , req , http . StatusNoContent )
2022-03-30 11:42:47 +03:00
2022-08-09 07:39:24 +03:00
req = NewRequest ( t , "GET" , url + "/" + filename )
MakeRequest ( t , req , http . StatusNotFound )
2022-03-30 11:42:47 +03:00
2023-12-22 02:59:59 +03:00
req = NewRequest ( t , "DELETE" , url + "/" + filename ) .
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
MakeRequest ( t , req , http . StatusNotFound )
2022-03-30 11:42:47 +03:00
2022-08-09 07:39:24 +03: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 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 07:39:24 +03:00
2023-12-22 02:59:59 +03:00
req = NewRequest ( t , "DELETE" , url + "/dummy.bin" ) .
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
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 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-08-09 07:39:24 +03:00
2023-12-22 02:59:59 +03:00
req := NewRequestWithBody ( t , "PUT" , url + "/" + filename , bytes . NewReader ( content ) ) .
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
MakeRequest ( t , req , http . StatusCreated )
req = NewRequest ( t , "DELETE" , url )
MakeRequest ( t , req , http . StatusUnauthorized )
2023-12-22 02:59:59 +03:00
req = NewRequest ( t , "DELETE" , url ) .
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
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 )
2023-12-22 02:59:59 +03:00
req = NewRequest ( t , "DELETE" , url ) .
AddBasicAuth ( user . Name )
2022-08-09 07:39:24 +03:00
MakeRequest ( t , req , http . StatusNotFound )
} )
2022-03-30 11:42:47 +03:00
} )
}