You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

api_packages_composer_test.go 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package integrations
  5. import (
  6. "archive/zip"
  7. "bytes"
  8. "fmt"
  9. "net/http"
  10. neturl "net/url"
  11. "testing"
  12. "code.gitea.io/gitea/models/db"
  13. "code.gitea.io/gitea/models/packages"
  14. "code.gitea.io/gitea/models/unittest"
  15. user_model "code.gitea.io/gitea/models/user"
  16. composer_module "code.gitea.io/gitea/modules/packages/composer"
  17. "code.gitea.io/gitea/modules/setting"
  18. "code.gitea.io/gitea/routers/api/packages/composer"
  19. "github.com/stretchr/testify/assert"
  20. )
  21. func TestPackageComposer(t *testing.T) {
  22. defer prepareTestEnv(t)()
  23. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  24. vendorName := "gitea"
  25. projectName := "composer-package"
  26. packageName := vendorName + "/" + projectName
  27. packageVersion := "1.0.3"
  28. packageDescription := "Package Description"
  29. packageType := "composer-plugin"
  30. packageAuthor := "Gitea Authors"
  31. packageLicense := "MIT"
  32. var buf bytes.Buffer
  33. archive := zip.NewWriter(&buf)
  34. w, _ := archive.Create("composer.json")
  35. w.Write([]byte(`{
  36. "name": "` + packageName + `",
  37. "description": "` + packageDescription + `",
  38. "type": "` + packageType + `",
  39. "license": "` + packageLicense + `",
  40. "authors": [
  41. {
  42. "name": "` + packageAuthor + `"
  43. }
  44. ]
  45. }`))
  46. archive.Close()
  47. content := buf.Bytes()
  48. url := fmt.Sprintf("%sapi/packages/%s/composer", setting.AppURL, user.Name)
  49. t.Run("ServiceIndex", func(t *testing.T) {
  50. defer PrintCurrentTest(t)()
  51. req := NewRequest(t, "GET", fmt.Sprintf("%s/packages.json", url))
  52. req = AddBasicAuthHeader(req, user.Name)
  53. resp := MakeRequest(t, req, http.StatusOK)
  54. var result composer.ServiceIndexResponse
  55. DecodeJSON(t, resp, &result)
  56. assert.Equal(t, url+"/search.json?q=%query%&type=%type%", result.SearchTemplate)
  57. assert.Equal(t, url+"/p2/%package%.json", result.MetadataTemplate)
  58. assert.Equal(t, url+"/list.json", result.PackageList)
  59. })
  60. t.Run("Upload", func(t *testing.T) {
  61. t.Run("MissingVersion", func(t *testing.T) {
  62. defer PrintCurrentTest(t)()
  63. req := NewRequestWithBody(t, "PUT", url, bytes.NewReader(content))
  64. req = AddBasicAuthHeader(req, user.Name)
  65. MakeRequest(t, req, http.StatusBadRequest)
  66. })
  67. t.Run("Valid", func(t *testing.T) {
  68. defer PrintCurrentTest(t)()
  69. uploadURL := url + "?version=" + packageVersion
  70. req := NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content))
  71. req = AddBasicAuthHeader(req, user.Name)
  72. MakeRequest(t, req, http.StatusCreated)
  73. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeComposer)
  74. assert.NoError(t, err)
  75. assert.Len(t, pvs, 1)
  76. pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
  77. assert.NoError(t, err)
  78. assert.NotNil(t, pd.SemVer)
  79. assert.IsType(t, &composer_module.Metadata{}, pd.Metadata)
  80. assert.Equal(t, packageName, pd.Package.Name)
  81. assert.Equal(t, packageVersion, pd.Version.Version)
  82. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  83. assert.NoError(t, err)
  84. assert.Len(t, pfs, 1)
  85. assert.Equal(t, fmt.Sprintf("%s-%s.%s.zip", vendorName, projectName, packageVersion), pfs[0].Name)
  86. assert.True(t, pfs[0].IsLead)
  87. pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID)
  88. assert.NoError(t, err)
  89. assert.Equal(t, int64(len(content)), pb.Size)
  90. req = NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader(content))
  91. req = AddBasicAuthHeader(req, user.Name)
  92. MakeRequest(t, req, http.StatusBadRequest)
  93. })
  94. })
  95. t.Run("Download", func(t *testing.T) {
  96. defer PrintCurrentTest(t)()
  97. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeComposer)
  98. assert.NoError(t, err)
  99. assert.Len(t, pvs, 1)
  100. assert.Equal(t, int64(0), pvs[0].DownloadCount)
  101. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  102. assert.NoError(t, err)
  103. assert.Len(t, pfs, 1)
  104. 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)))
  105. req = AddBasicAuthHeader(req, user.Name)
  106. resp := MakeRequest(t, req, http.StatusOK)
  107. assert.Equal(t, content, resp.Body.Bytes())
  108. pvs, err = packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeComposer)
  109. assert.NoError(t, err)
  110. assert.Len(t, pvs, 1)
  111. assert.Equal(t, int64(1), pvs[0].DownloadCount)
  112. })
  113. t.Run("SearchService", func(t *testing.T) {
  114. defer PrintCurrentTest(t)()
  115. cases := []struct {
  116. Query string
  117. Type string
  118. Page int
  119. PerPage int
  120. ExpectedTotal int64
  121. ExpectedResults int
  122. }{
  123. {"", "", 0, 0, 1, 1},
  124. {"", "", 1, 1, 1, 1},
  125. {"test", "", 1, 0, 0, 0},
  126. {"gitea", "", 1, 1, 1, 1},
  127. {"gitea", "", 2, 1, 1, 0},
  128. {"", packageType, 1, 1, 1, 1},
  129. {"gitea", packageType, 1, 1, 1, 1},
  130. {"gitea", "dummy", 1, 1, 0, 0},
  131. }
  132. for i, c := range cases {
  133. 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))
  134. req = AddBasicAuthHeader(req, user.Name)
  135. resp := MakeRequest(t, req, http.StatusOK)
  136. var result composer.SearchResultResponse
  137. DecodeJSON(t, resp, &result)
  138. assert.Equal(t, c.ExpectedTotal, result.Total, "case %d: unexpected total hits", i)
  139. assert.Len(t, result.Results, c.ExpectedResults, "case %d: unexpected result count", i)
  140. }
  141. })
  142. t.Run("EnumeratePackages", func(t *testing.T) {
  143. defer PrintCurrentTest(t)()
  144. req := NewRequest(t, "GET", url+"/list.json")
  145. req = AddBasicAuthHeader(req, user.Name)
  146. resp := MakeRequest(t, req, http.StatusOK)
  147. var result map[string][]string
  148. DecodeJSON(t, resp, &result)
  149. assert.Contains(t, result, "packageNames")
  150. names := result["packageNames"]
  151. assert.Len(t, names, 1)
  152. assert.Equal(t, packageName, names[0])
  153. })
  154. t.Run("PackageMetadata", func(t *testing.T) {
  155. defer PrintCurrentTest(t)()
  156. req := NewRequest(t, "GET", fmt.Sprintf("%s/p2/%s/%s.json", url, vendorName, projectName))
  157. req = AddBasicAuthHeader(req, user.Name)
  158. resp := MakeRequest(t, req, http.StatusOK)
  159. var result composer.PackageMetadataResponse
  160. DecodeJSON(t, resp, &result)
  161. assert.Contains(t, result.Packages, packageName)
  162. pkgs := result.Packages[packageName]
  163. assert.Len(t, pkgs, 1)
  164. assert.Equal(t, packageName, pkgs[0].Name)
  165. assert.Equal(t, packageVersion, pkgs[0].Version)
  166. assert.Equal(t, packageType, pkgs[0].Type)
  167. assert.Equal(t, packageDescription, pkgs[0].Description)
  168. assert.Len(t, pkgs[0].Authors, 1)
  169. assert.Equal(t, packageAuthor, pkgs[0].Authors[0].Name)
  170. assert.Equal(t, "zip", pkgs[0].Dist.Type)
  171. assert.Equal(t, "7b40bfd6da811b2b78deec1e944f156dbb2c747b", pkgs[0].Dist.Checksum)
  172. })
  173. }