2023-05-14 18:38:40 +03:00
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"archive/zip"
"bytes"
"fmt"
"net/http"
"testing"
"time"
"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/tests"
"github.com/stretchr/testify/assert"
)
func TestPackageGo ( t * testing . T ) {
defer tests . PrepareTestEnv ( t ) ( )
user := unittest . AssertExistsAndLoadBean ( t , & user_model . User { ID : 2 } )
packageName := "gitea.com/go-gitea/gitea"
packageVersion := "v0.0.1"
packageVersion2 := "v0.0.2"
goModContent := ` module "gitea.com/go-gitea/gitea" `
createArchive := func ( files map [ string ] [ ] byte ) [ ] byte {
var buf bytes . Buffer
zw := zip . NewWriter ( & buf )
for name , content := range files {
w , _ := zw . Create ( name )
w . Write ( content )
}
zw . Close ( )
return buf . Bytes ( )
}
url := fmt . Sprintf ( "/api/packages/%s/go" , user . Name )
t . Run ( "Upload" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
content := createArchive ( nil )
req := NewRequestWithBody ( t , "PUT" , url + "/upload" , bytes . NewReader ( content ) )
MakeRequest ( t , req , http . StatusUnauthorized )
2023-12-22 02:59:59 +03:00
req = NewRequestWithBody ( t , "PUT" , url + "/upload" , bytes . NewReader ( content ) ) .
AddBasicAuth ( user . Name )
2023-05-14 18:38:40 +03:00
MakeRequest ( t , req , http . StatusBadRequest )
content = createArchive ( map [ string ] [ ] byte {
packageName + "@" + packageVersion + "/go.mod" : [ ] byte ( goModContent ) ,
} )
2023-12-22 02:59:59 +03:00
req = NewRequestWithBody ( t , "PUT" , url + "/upload" , bytes . NewReader ( content ) ) .
AddBasicAuth ( user . Name )
2023-05-14 18:38:40 +03:00
MakeRequest ( t , req , http . StatusCreated )
pvs , err := packages . GetVersionsByPackageType ( db . DefaultContext , user . ID , packages . TypeGo )
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 , packageVersion + ".zip" , 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 )
2023-12-22 02:59:59 +03:00
req = NewRequestWithBody ( t , "PUT" , url + "/upload" , bytes . NewReader ( content ) ) .
AddBasicAuth ( user . Name )
2023-05-14 18:38:40 +03:00
MakeRequest ( t , req , http . StatusConflict )
time . Sleep ( time . Second )
content = createArchive ( map [ string ] [ ] byte {
packageName + "@" + packageVersion2 + "/go.mod" : [ ] byte ( goModContent ) ,
} )
2023-12-22 02:59:59 +03:00
req = NewRequestWithBody ( t , "PUT" , url + "/upload" , bytes . NewReader ( content ) ) .
AddBasicAuth ( user . Name )
2023-05-14 18:38:40 +03:00
MakeRequest ( t , req , http . StatusCreated )
} )
t . Run ( "List" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "%s/%s/@v/list" , url , packageName ) )
resp := MakeRequest ( t , req , http . StatusOK )
assert . Equal ( t , packageVersion + "\n" + packageVersion2 + "\n" , resp . Body . String ( ) )
} )
t . Run ( "Info" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "%s/%s/@v/%s.info" , url , packageName , packageVersion ) )
resp := MakeRequest ( t , req , http . StatusOK )
type Info struct {
Version string ` json:"Version" `
Time time . Time ` json:"Time" `
}
info := & Info { }
DecodeJSON ( t , resp , & info )
assert . Equal ( t , packageVersion , info . Version )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "%s/%s/@v/latest.info" , url , packageName ) )
resp = MakeRequest ( t , req , http . StatusOK )
info = & Info { }
DecodeJSON ( t , resp , & info )
assert . Equal ( t , packageVersion2 , info . Version )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "%s/%s/@latest" , url , packageName ) )
resp = MakeRequest ( t , req , http . StatusOK )
info = & Info { }
DecodeJSON ( t , resp , & info )
assert . Equal ( t , packageVersion2 , info . Version )
} )
t . Run ( "GoMod" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "%s/%s/@v/%s.mod" , url , packageName , packageVersion ) )
resp := MakeRequest ( t , req , http . StatusOK )
assert . Equal ( t , goModContent , resp . Body . String ( ) )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "%s/%s/@v/latest.mod" , url , packageName ) )
resp = MakeRequest ( t , req , http . StatusOK )
assert . Equal ( t , goModContent , resp . Body . String ( ) )
} )
t . Run ( "Download" , func ( t * testing . T ) {
defer tests . PrintCurrentTest ( t ) ( )
req := NewRequest ( t , "GET" , fmt . Sprintf ( "%s/%s/@v/%s.zip" , url , packageName , packageVersion ) )
MakeRequest ( t , req , http . StatusOK )
req = NewRequest ( t , "GET" , fmt . Sprintf ( "%s/%s/@v/latest.zip" , url , packageName ) )
MakeRequest ( t , req , http . StatusOK )
} )
}