code.gitea.io/gitea@v1.22.3/tests/integration/api_packages_vagrant_test.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package integration 5 6 import ( 7 "archive/tar" 8 "bytes" 9 "compress/gzip" 10 "fmt" 11 "net/http" 12 "strings" 13 "testing" 14 15 auth_model "code.gitea.io/gitea/models/auth" 16 "code.gitea.io/gitea/models/db" 17 "code.gitea.io/gitea/models/packages" 18 "code.gitea.io/gitea/models/unittest" 19 user_model "code.gitea.io/gitea/models/user" 20 "code.gitea.io/gitea/modules/json" 21 vagrant_module "code.gitea.io/gitea/modules/packages/vagrant" 22 "code.gitea.io/gitea/tests" 23 24 "github.com/stretchr/testify/assert" 25 ) 26 27 func TestPackageVagrant(t *testing.T) { 28 defer tests.PrepareTestEnv(t)() 29 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 30 31 token := "Bearer " + getUserToken(t, user.Name, auth_model.AccessTokenScopeWritePackage) 32 33 packageName := "test_package" 34 packageVersion := "1.0.1" 35 packageDescription := "Test Description" 36 packageProvider := "virtualbox" 37 38 filename := fmt.Sprintf("%s.box", packageProvider) 39 40 infoContent, _ := json.Marshal(map[string]string{ 41 "description": packageDescription, 42 }) 43 44 var buf bytes.Buffer 45 zw := gzip.NewWriter(&buf) 46 archive := tar.NewWriter(zw) 47 archive.WriteHeader(&tar.Header{ 48 Name: "info.json", 49 Mode: 0o600, 50 Size: int64(len(infoContent)), 51 }) 52 archive.Write(infoContent) 53 archive.Close() 54 zw.Close() 55 content := buf.Bytes() 56 57 root := fmt.Sprintf("/api/packages/%s/vagrant", user.Name) 58 59 t.Run("Authenticate", func(t *testing.T) { 60 defer tests.PrintCurrentTest(t)() 61 62 authenticateURL := fmt.Sprintf("%s/authenticate", root) 63 64 req := NewRequest(t, "GET", authenticateURL) 65 MakeRequest(t, req, http.StatusUnauthorized) 66 67 req = NewRequest(t, "GET", authenticateURL). 68 AddTokenAuth(token) 69 MakeRequest(t, req, http.StatusOK) 70 }) 71 72 boxURL := fmt.Sprintf("%s/%s", root, packageName) 73 74 t.Run("Upload", func(t *testing.T) { 75 defer tests.PrintCurrentTest(t)() 76 77 req := NewRequest(t, "HEAD", boxURL) 78 MakeRequest(t, req, http.StatusNotFound) 79 80 uploadURL := fmt.Sprintf("%s/%s/%s", boxURL, packageVersion, filename) 81 82 req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)) 83 MakeRequest(t, req, http.StatusUnauthorized) 84 85 req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)). 86 AddTokenAuth(token) 87 MakeRequest(t, req, http.StatusCreated) 88 89 req = NewRequest(t, "HEAD", boxURL) 90 resp := MakeRequest(t, req, http.StatusOK) 91 assert.True(t, strings.HasPrefix(resp.Header().Get("Content-Type"), "application/json")) 92 93 pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeVagrant) 94 assert.NoError(t, err) 95 assert.Len(t, pvs, 1) 96 97 pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0]) 98 assert.NoError(t, err) 99 assert.NotNil(t, pd.SemVer) 100 assert.IsType(t, &vagrant_module.Metadata{}, pd.Metadata) 101 assert.Equal(t, packageName, pd.Package.Name) 102 assert.Equal(t, packageVersion, pd.Version.Version) 103 104 pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID) 105 assert.NoError(t, err) 106 assert.Len(t, pfs, 1) 107 assert.Equal(t, filename, pfs[0].Name) 108 assert.True(t, pfs[0].IsLead) 109 110 pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID) 111 assert.NoError(t, err) 112 assert.Equal(t, int64(len(content)), pb.Size) 113 114 req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)). 115 AddTokenAuth(token) 116 MakeRequest(t, req, http.StatusConflict) 117 }) 118 119 t.Run("Download", func(t *testing.T) { 120 defer tests.PrintCurrentTest(t)() 121 122 req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/%s", boxURL, packageVersion, filename)) 123 resp := MakeRequest(t, req, http.StatusOK) 124 125 assert.Equal(t, content, resp.Body.Bytes()) 126 }) 127 128 t.Run("EnumeratePackageVersions", func(t *testing.T) { 129 defer tests.PrintCurrentTest(t)() 130 131 req := NewRequest(t, "GET", boxURL) 132 resp := MakeRequest(t, req, http.StatusOK) 133 134 type providerData struct { 135 Name string `json:"name"` 136 URL string `json:"url"` 137 Checksum string `json:"checksum"` 138 ChecksumType string `json:"checksum_type"` 139 } 140 141 type versionMetadata struct { 142 Version string `json:"version"` 143 Status string `json:"status"` 144 DescriptionHTML string `json:"description_html,omitempty"` 145 DescriptionMarkdown string `json:"description_markdown,omitempty"` 146 Providers []*providerData `json:"providers"` 147 } 148 149 type packageMetadata struct { 150 Name string `json:"name"` 151 Description string `json:"description,omitempty"` 152 ShortDescription string `json:"short_description,omitempty"` 153 Versions []*versionMetadata `json:"versions"` 154 } 155 156 var result packageMetadata 157 DecodeJSON(t, resp, &result) 158 159 assert.Equal(t, packageName, result.Name) 160 assert.Equal(t, packageDescription, result.Description) 161 assert.Len(t, result.Versions, 1) 162 version := result.Versions[0] 163 assert.Equal(t, packageVersion, version.Version) 164 assert.Equal(t, "active", version.Status) 165 assert.Len(t, version.Providers, 1) 166 provider := version.Providers[0] 167 assert.Equal(t, packageProvider, provider.Name) 168 assert.Equal(t, "sha512", provider.ChecksumType) 169 assert.Equal(t, "259bebd6160acad695016d22a45812e26f187aaf78e71a4c23ee3201528346293f991af3468a8c6c5d2a21d7d9e1bdc1bf79b87110b2fddfcc5a0d45963c7c30", provider.Checksum) 170 }) 171 }