code.gitea.io/gitea@v1.22.3/tests/integration/api_packages_composer_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package integration 5 6 import ( 7 "archive/zip" 8 "bytes" 9 "fmt" 10 "net/http" 11 neturl "net/url" 12 "testing" 13 14 "code.gitea.io/gitea/models/db" 15 "code.gitea.io/gitea/models/packages" 16 "code.gitea.io/gitea/models/unittest" 17 user_model "code.gitea.io/gitea/models/user" 18 composer_module "code.gitea.io/gitea/modules/packages/composer" 19 "code.gitea.io/gitea/modules/setting" 20 "code.gitea.io/gitea/routers/api/packages/composer" 21 "code.gitea.io/gitea/tests" 22 23 "github.com/stretchr/testify/assert" 24 ) 25 26 func TestPackageComposer(t *testing.T) { 27 defer tests.PrepareTestEnv(t)() 28 29 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 30 31 vendorName := "gitea" 32 projectName := "composer-package" 33 packageName := vendorName + "/" + projectName 34 packageVersion := "1.0.3" 35 packageDescription := "Package Description" 36 packageType := "composer-plugin" 37 packageAuthor := "Gitea Authors" 38 packageLicense := "MIT" 39 packageBin := "./bin/script" 40 41 var buf bytes.Buffer 42 archive := zip.NewWriter(&buf) 43 w, _ := archive.Create("composer.json") 44 w.Write([]byte(`{ 45 "name": "` + packageName + `", 46 "description": "` + packageDescription + `", 47 "type": "` + packageType + `", 48 "license": "` + packageLicense + `", 49 "authors": [ 50 { 51 "name": "` + packageAuthor + `" 52 } 53 ], 54 "bin": [ 55 "` + packageBin + `" 56 ] 57 }`)) 58 archive.Close() 59 content := buf.Bytes() 60 61 url := fmt.Sprintf("%sapi/packages/%s/composer", setting.AppURL, user.Name) 62 63 t.Run("ServiceIndex", func(t *testing.T) { 64 defer tests.PrintCurrentTest(t)() 65 66 req := NewRequest(t, "GET", fmt.Sprintf("%s/packages.json", url)). 67 AddBasicAuth(user.Name) 68 resp := MakeRequest(t, req, http.StatusOK) 69 70 var result composer.ServiceIndexResponse 71 DecodeJSON(t, resp, &result) 72 73 assert.Equal(t, url+"/search.json?q=%query%&type=%type%", result.SearchTemplate) 74 assert.Equal(t, url+"/p2/%package%.json", result.MetadataTemplate) 75 assert.Equal(t, url+"/list.json", result.PackageList) 76 }) 77 78 t.Run("Upload", func(t *testing.T) { 79 t.Run("MissingVersion", func(t *testing.T) { 80 defer tests.PrintCurrentTest(t)() 81 82 req := NewRequestWithBody(t, "PUT", url, bytes.NewReader(content)). 83 AddBasicAuth(user.Name) 84 MakeRequest(t, req, http.StatusBadRequest) 85 }) 86 87 t.Run("Valid", func(t *testing.T) { 88 defer tests.PrintCurrentTest(t)() 89 90 uploadURL := url + "?version=" + packageVersion 91 92 req := NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)). 93 AddBasicAuth(user.Name) 94 MakeRequest(t, req, http.StatusCreated) 95 96 pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeComposer) 97 assert.NoError(t, err) 98 assert.Len(t, pvs, 1) 99 100 pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0]) 101 assert.NoError(t, err) 102 assert.NotNil(t, pd.SemVer) 103 assert.IsType(t, &composer_module.Metadata{}, pd.Metadata) 104 assert.Equal(t, packageName, pd.Package.Name) 105 assert.Equal(t, packageVersion, pd.Version.Version) 106 107 pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID) 108 assert.NoError(t, err) 109 assert.Len(t, pfs, 1) 110 assert.Equal(t, fmt.Sprintf("%s-%s.%s.zip", vendorName, projectName, packageVersion), pfs[0].Name) 111 assert.True(t, pfs[0].IsLead) 112 113 pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID) 114 assert.NoError(t, err) 115 assert.Equal(t, int64(len(content)), pb.Size) 116 117 req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content)). 118 AddBasicAuth(user.Name) 119 MakeRequest(t, req, http.StatusConflict) 120 }) 121 }) 122 123 t.Run("Download", func(t *testing.T) { 124 defer tests.PrintCurrentTest(t)() 125 126 pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeComposer) 127 assert.NoError(t, err) 128 assert.Len(t, pvs, 1) 129 assert.Equal(t, int64(0), pvs[0].DownloadCount) 130 131 pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID) 132 assert.NoError(t, err) 133 assert.Len(t, pfs, 1) 134 135 req := NewRequest(t, "GET", fmt.Sprintf("%s/files/%s/%s/%s", url, neturl.PathEscape(packageName), neturl.PathEscape(pvs[0].LowerVersion), neturl.PathEscape(pfs[0].LowerName))). 136 AddBasicAuth(user.Name) 137 resp := MakeRequest(t, req, http.StatusOK) 138 139 assert.Equal(t, content, resp.Body.Bytes()) 140 141 pvs, err = packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeComposer) 142 assert.NoError(t, err) 143 assert.Len(t, pvs, 1) 144 assert.Equal(t, int64(1), pvs[0].DownloadCount) 145 }) 146 147 t.Run("SearchService", func(t *testing.T) { 148 defer tests.PrintCurrentTest(t)() 149 150 cases := []struct { 151 Query string 152 Type string 153 Page int 154 PerPage int 155 ExpectedTotal int64 156 ExpectedResults int 157 }{ 158 {"", "", 0, 0, 1, 1}, 159 {"", "", 1, 1, 1, 1}, 160 {"test", "", 1, 0, 0, 0}, 161 {"gitea", "", 1, 1, 1, 1}, 162 {"gitea", "", 2, 1, 1, 0}, 163 {"", packageType, 1, 1, 1, 1}, 164 {"gitea", packageType, 1, 1, 1, 1}, 165 {"gitea", "dummy", 1, 1, 0, 0}, 166 } 167 168 for i, c := range cases { 169 req := NewRequest(t, "GET", fmt.Sprintf("%s/search.json?q=%s&type=%s&page=%d&per_page=%d", url, c.Query, c.Type, c.Page, c.PerPage)). 170 AddBasicAuth(user.Name) 171 resp := MakeRequest(t, req, http.StatusOK) 172 173 var result composer.SearchResultResponse 174 DecodeJSON(t, resp, &result) 175 176 assert.Equal(t, c.ExpectedTotal, result.Total, "case %d: unexpected total hits", i) 177 assert.Len(t, result.Results, c.ExpectedResults, "case %d: unexpected result count", i) 178 } 179 }) 180 181 t.Run("EnumeratePackages", func(t *testing.T) { 182 defer tests.PrintCurrentTest(t)() 183 184 req := NewRequest(t, "GET", url+"/list.json"). 185 AddBasicAuth(user.Name) 186 resp := MakeRequest(t, req, http.StatusOK) 187 188 var result map[string][]string 189 DecodeJSON(t, resp, &result) 190 191 assert.Contains(t, result, "packageNames") 192 names := result["packageNames"] 193 assert.Len(t, names, 1) 194 assert.Equal(t, packageName, names[0]) 195 }) 196 197 t.Run("PackageMetadata", func(t *testing.T) { 198 defer tests.PrintCurrentTest(t)() 199 200 req := NewRequest(t, "GET", fmt.Sprintf("%s/p2/%s/%s.json", url, vendorName, projectName)). 201 AddBasicAuth(user.Name) 202 resp := MakeRequest(t, req, http.StatusOK) 203 204 var result composer.PackageMetadataResponse 205 DecodeJSON(t, resp, &result) 206 207 assert.Contains(t, result.Packages, packageName) 208 pkgs := result.Packages[packageName] 209 assert.Len(t, pkgs, 1) 210 assert.Equal(t, packageName, pkgs[0].Name) 211 assert.Equal(t, packageVersion, pkgs[0].Version) 212 assert.Equal(t, packageType, pkgs[0].Type) 213 assert.Equal(t, packageDescription, pkgs[0].Description) 214 assert.Len(t, pkgs[0].Authors, 1) 215 assert.Equal(t, packageAuthor, pkgs[0].Authors[0].Name) 216 assert.Equal(t, "zip", pkgs[0].Dist.Type) 217 assert.Equal(t, "4f5fa464c3cb808a1df191dbf6cb75363f8b7072", pkgs[0].Dist.Checksum) 218 assert.Len(t, pkgs[0].Bin, 1) 219 assert.Equal(t, packageBin, pkgs[0].Bin[0]) 220 }) 221 }