mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Add support for Vagrant packages (#20930)
* Add support for Vagrant boxes. * Add authentication. * Add tests. * Add integration tests. * Add docs. * Add icons. * Update routers/api/packages/api.go Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
		
							
								
								
									
										170
									
								
								integrations/api_packages_vagrant_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								integrations/api_packages_vagrant_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,170 @@ | ||||
| // Copyright 2022 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. | ||||
|  | ||||
| package integrations | ||||
|  | ||||
| import ( | ||||
| 	"archive/tar" | ||||
| 	"bytes" | ||||
| 	"compress/gzip" | ||||
| 	"fmt" | ||||
| 	"net/http" | ||||
| 	"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/json" | ||||
| 	vagrant_module "code.gitea.io/gitea/modules/packages/vagrant" | ||||
|  | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestPackageVagrant(t *testing.T) { | ||||
| 	defer prepareTestEnv(t)() | ||||
| 	user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) | ||||
|  | ||||
| 	token := "Bearer " + getUserToken(t, user.Name) | ||||
|  | ||||
| 	packageName := "test_package" | ||||
| 	packageVersion := "1.0.1" | ||||
| 	packageDescription := "Test Description" | ||||
| 	packageProvider := "virtualbox" | ||||
|  | ||||
| 	filename := fmt.Sprintf("%s.box", packageProvider) | ||||
|  | ||||
| 	infoContent, _ := json.Marshal(map[string]string{ | ||||
| 		"description": packageDescription, | ||||
| 	}) | ||||
|  | ||||
| 	var buf bytes.Buffer | ||||
| 	zw := gzip.NewWriter(&buf) | ||||
| 	archive := tar.NewWriter(zw) | ||||
| 	archive.WriteHeader(&tar.Header{ | ||||
| 		Name: "info.json", | ||||
| 		Mode: 0o600, | ||||
| 		Size: int64(len(infoContent)), | ||||
| 	}) | ||||
| 	archive.Write(infoContent) | ||||
| 	archive.Close() | ||||
| 	zw.Close() | ||||
| 	content := buf.Bytes() | ||||
|  | ||||
| 	root := fmt.Sprintf("/api/packages/%s/vagrant", user.Name) | ||||
|  | ||||
| 	t.Run("Authenticate", func(t *testing.T) { | ||||
| 		defer PrintCurrentTest(t)() | ||||
|  | ||||
| 		authenticateURL := fmt.Sprintf("%s/authenticate", root) | ||||
|  | ||||
| 		req := NewRequest(t, "GET", authenticateURL) | ||||
| 		MakeRequest(t, req, http.StatusUnauthorized) | ||||
|  | ||||
| 		req = NewRequest(t, "GET", authenticateURL) | ||||
| 		addTokenAuthHeader(req, token) | ||||
| 		MakeRequest(t, req, http.StatusOK) | ||||
| 	}) | ||||
|  | ||||
| 	boxURL := fmt.Sprintf("%s/%s", root, packageName) | ||||
|  | ||||
| 	t.Run("Upload", func(t *testing.T) { | ||||
| 		defer PrintCurrentTest(t)() | ||||
|  | ||||
| 		req := NewRequest(t, "HEAD", boxURL) | ||||
| 		MakeRequest(t, req, http.StatusNotFound) | ||||
|  | ||||
| 		uploadURL := fmt.Sprintf("%s/%s/%s", boxURL, packageVersion, filename) | ||||
|  | ||||
| 		req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)) | ||||
| 		MakeRequest(t, req, http.StatusUnauthorized) | ||||
|  | ||||
| 		req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)) | ||||
| 		addTokenAuthHeader(req, token) | ||||
| 		MakeRequest(t, req, http.StatusCreated) | ||||
|  | ||||
| 		req = NewRequest(t, "HEAD", boxURL) | ||||
| 		resp := MakeRequest(t, req, http.StatusOK) | ||||
| 		assert.True(t, strings.HasPrefix(resp.HeaderMap.Get("Content-Type"), "application/json")) | ||||
|  | ||||
| 		pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeVagrant) | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.Len(t, pvs, 1) | ||||
|  | ||||
| 		pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0]) | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.NotNil(t, pd.SemVer) | ||||
| 		assert.IsType(t, &vagrant_module.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(len(content)), pb.Size) | ||||
|  | ||||
| 		req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)) | ||||
| 		addTokenAuthHeader(req, token) | ||||
| 		MakeRequest(t, req, http.StatusConflict) | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("Download", func(t *testing.T) { | ||||
| 		defer PrintCurrentTest(t)() | ||||
|  | ||||
| 		req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s", boxURL, packageVersion, filename)) | ||||
| 		resp := MakeRequest(t, req, http.StatusOK) | ||||
|  | ||||
| 		assert.Equal(t, content, resp.Body.Bytes()) | ||||
| 	}) | ||||
|  | ||||
| 	t.Run("EnumeratePackageVersions", func(t *testing.T) { | ||||
| 		defer PrintCurrentTest(t)() | ||||
|  | ||||
| 		req := NewRequest(t, "GET", boxURL) | ||||
| 		resp := MakeRequest(t, req, http.StatusOK) | ||||
|  | ||||
| 		type providerData struct { | ||||
| 			Name         string `json:"name"` | ||||
| 			URL          string `json:"url"` | ||||
| 			Checksum     string `json:"checksum"` | ||||
| 			ChecksumType string `json:"checksum_type"` | ||||
| 		} | ||||
|  | ||||
| 		type versionMetadata struct { | ||||
| 			Version             string          `json:"version"` | ||||
| 			Status              string          `json:"status"` | ||||
| 			DescriptionHTML     string          `json:"description_html,omitempty"` | ||||
| 			DescriptionMarkdown string          `json:"description_markdown,omitempty"` | ||||
| 			Providers           []*providerData `json:"providers"` | ||||
| 		} | ||||
|  | ||||
| 		type packageMetadata struct { | ||||
| 			Name             string             `json:"name"` | ||||
| 			Description      string             `json:"description,omitempty"` | ||||
| 			ShortDescription string             `json:"short_description,omitempty"` | ||||
| 			Versions         []*versionMetadata `json:"versions"` | ||||
| 		} | ||||
|  | ||||
| 		var result packageMetadata | ||||
| 		DecodeJSON(t, resp, &result) | ||||
|  | ||||
| 		assert.Equal(t, packageName, result.Name) | ||||
| 		assert.Equal(t, packageDescription, result.Description) | ||||
| 		assert.Len(t, result.Versions, 1) | ||||
| 		version := result.Versions[0] | ||||
| 		assert.Equal(t, packageVersion, version.Version) | ||||
| 		assert.Equal(t, "active", version.Status) | ||||
| 		assert.Len(t, version.Providers, 1) | ||||
| 		provider := version.Providers[0] | ||||
| 		assert.Equal(t, packageProvider, provider.Name) | ||||
| 		assert.Equal(t, "sha512", provider.ChecksumType) | ||||
| 		assert.Equal(t, "259bebd6160acad695016d22a45812e26f187aaf78e71a4c23ee3201528346293f991af3468a8c6c5d2a21d7d9e1bdc1bf79b87110b2fddfcc5a0d45963c7c30", provider.Checksum) | ||||
| 	}) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user