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"
"io"
"mime/multipart"
"net/http"
"regexp"
"strings"
"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"
"code.gitea.io/gitea/modules/packages/pypi"
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 TestPackagePyPI ( 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 := "test-package"
2022-11-08 04:41:39 +03:00
packageVersion := "1!1.0.1+r1234"
2022-03-30 11:42:47 +03:00
packageAuthor := "KN4CK3R"
packageDescription := "Test Description"
content := "test"
hashSHA256 := "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"
root := fmt . Sprintf ( "/api/packages/%s/pypi" , user . Name )
uploadFile := func ( t * testing . T , filename , content string , expectedStatus int ) {
body := & bytes . Buffer { }
writer := multipart . NewWriter ( body )
part , _ := writer . CreateFormFile ( "content" , filename )
_ , _ = io . Copy ( part , strings . NewReader ( content ) )
writer . WriteField ( "name" , packageName )
writer . WriteField ( "version" , packageVersion )
writer . WriteField ( "author" , packageAuthor )
writer . WriteField ( "summary" , packageDescription )
writer . WriteField ( "description" , packageDescription )
writer . WriteField ( "sha256_digest" , hashSHA256 )
writer . WriteField ( "requires_python" , "3.6" )
_ = writer . Close ( )
2023-12-22 02:59:59 +03:00
req := NewRequestWithBody ( t , "POST" , root , body ) .
SetHeader ( "Content-Type" , writer . FormDataContentType ( ) ) .
AddBasicAuth ( user . Name )
2022-03-30 11:42:47 +03:00
MakeRequest ( t , req , expectedStatus )
}
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
filename := "test.whl"
uploadFile ( t , filename , content , http . StatusCreated )
pvs , err := packages . GetVersionsByPackageType ( db . DefaultContext , user . ID , packages . TypePyPI )
assert . NoError ( t , err )
assert . Len ( t , pvs , 1 )
pd , err := packages . GetPackageDescriptor ( db . DefaultContext , pvs [ 0 ] )
assert . NoError ( t , err )
2022-11-08 04:41:39 +03:00
assert . Nil ( t , pd . SemVer )
2022-03-30 11:42:47 +03:00
assert . IsType ( t , & pypi . Metadata { } , 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 ( 4 ) , pb . Size )
} )
t . Run ( "UploadAddFile" , func ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 11:42:47 +03:00
filename := "test.tar.gz"
uploadFile ( t , filename , content , http . StatusCreated )
pvs , err := packages . GetVersionsByPackageType ( db . DefaultContext , user . ID , packages . TypePyPI )
assert . NoError ( t , err )
assert . Len ( t , pvs , 1 )
pd , err := packages . GetPackageDescriptor ( db . DefaultContext , pvs [ 0 ] )
assert . NoError ( t , err )
2022-11-08 04:41:39 +03:00
assert . Nil ( t , pd . SemVer )
2022-03-30 11:42:47 +03:00
assert . IsType ( t , & pypi . Metadata { } , 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 , 2 )
pf , err := packages . GetFileForVersionByName ( db . DefaultContext , pvs [ 0 ] . ID , filename , packages . EmptyFileKey )
assert . NoError ( t , err )
assert . Equal ( t , filename , pf . Name )
assert . True ( t , pf . IsLead )
pb , err := packages . GetBlobByID ( db . DefaultContext , pf . BlobID )
assert . NoError ( t , err )
assert . Equal ( t , int64 ( 4 ) , pb . Size )
} )
t . Run ( "UploadHashMismatch" , func ( t * testing . T ) {
2022-09-02 22:18:23 +03:00
defer tests . PrintCurrentTest ( t ) ( )
2022-03-30 11:42:47 +03:00
filename := "test2.whl"
uploadFile ( t , filename , "dummy" , http . StatusBadRequest )
} )
t . Run ( "UploadExists" , 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-10-10 16:39:58 +03:00
uploadFile ( t , "test.whl" , content , http . StatusConflict )
uploadFile ( t , "test.tar.gz" , content , http . StatusConflict )
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
downloadFile := func ( filename string ) {
2023-12-22 02:59:59 +03:00
req := NewRequest ( t , "GET" , fmt . Sprintf ( "%s/files/%s/%s/%s" , root , packageName , packageVersion , filename ) ) .
AddBasicAuth ( user . Name )
2022-03-30 11:42:47 +03:00
resp := MakeRequest ( t , req , http . StatusOK )
assert . Equal ( t , [ ] byte ( content ) , resp . Body . Bytes ( ) )
}
downloadFile ( "test.whl" )
downloadFile ( "test.tar.gz" )
pvs , err := packages . GetVersionsByPackageType ( db . DefaultContext , user . ID , packages . TypePyPI )
assert . NoError ( t , err )
assert . Len ( t , pvs , 1 )
assert . Equal ( t , int64 ( 2 ) , pvs [ 0 ] . DownloadCount )
} )
t . Run ( "PackageMetadata" , 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 := NewRequest ( t , "GET" , fmt . Sprintf ( "%s/simple/%s" , root , packageName ) ) .
AddBasicAuth ( user . Name )
2022-03-30 11:42:47 +03:00
resp := MakeRequest ( t , req , http . StatusOK )
htmlDoc := NewHTMLParser ( t , resp . Body )
nodes := htmlDoc . doc . Find ( "a" ) . Nodes
assert . Len ( t , nodes , 2 )
2022-11-07 22:35:04 +03:00
hrefMatcher := regexp . MustCompile ( fmt . Sprintf ( ` %s/files/%s/%s/test\..+#sha256-%s ` , root , regexp . QuoteMeta ( packageName ) , regexp . QuoteMeta ( packageVersion ) , hashSHA256 ) )
2022-03-30 11:42:47 +03:00
for _ , a := range nodes {
for _ , att := range a . Attr {
switch att . Key {
case "href" :
assert . Regexp ( t , hrefMatcher , att . Val )
case "data-requires-python" :
assert . Equal ( t , "3.6" , att . Val )
default :
t . Fail ( )
}
}
}
} )
}