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_helm_test.go 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Copyright 2022 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/tar"
  7. "bytes"
  8. "compress/gzip"
  9. "fmt"
  10. "net/http"
  11. "testing"
  12. "time"
  13. "code.gitea.io/gitea/models/db"
  14. "code.gitea.io/gitea/models/packages"
  15. "code.gitea.io/gitea/models/unittest"
  16. user_model "code.gitea.io/gitea/models/user"
  17. helm_module "code.gitea.io/gitea/modules/packages/helm"
  18. "code.gitea.io/gitea/modules/setting"
  19. "github.com/stretchr/testify/assert"
  20. "gopkg.in/yaml.v2"
  21. )
  22. func TestPackageHelm(t *testing.T) {
  23. defer prepareTestEnv(t)()
  24. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  25. packageName := "test-chart"
  26. packageVersion := "1.0.3"
  27. packageAuthor := "KN4CK3R"
  28. packageDescription := "Gitea Test Package"
  29. filename := fmt.Sprintf("%s-%s.tgz", packageName, packageVersion)
  30. chartContent := `apiVersion: v2
  31. description: ` + packageDescription + `
  32. name: ` + packageName + `
  33. type: application
  34. version: ` + packageVersion + `
  35. maintainers:
  36. - name: ` + packageAuthor + `
  37. dependencies:
  38. - name: dep1
  39. repository: https://example.com/
  40. version: 1.0.0`
  41. var buf bytes.Buffer
  42. zw := gzip.NewWriter(&buf)
  43. archive := tar.NewWriter(zw)
  44. archive.WriteHeader(&tar.Header{
  45. Name: fmt.Sprintf("%s/Chart.yaml", packageName),
  46. Mode: 0o600,
  47. Size: int64(len(chartContent)),
  48. })
  49. archive.Write([]byte(chartContent))
  50. archive.Close()
  51. zw.Close()
  52. content := buf.Bytes()
  53. url := fmt.Sprintf("/api/packages/%s/helm", user.Name)
  54. t.Run("Upload", func(t *testing.T) {
  55. defer PrintCurrentTest(t)()
  56. uploadURL := url + "/api/charts"
  57. req := NewRequestWithBody(t, "POST", uploadURL, bytes.NewReader(content))
  58. req = AddBasicAuthHeader(req, user.Name)
  59. MakeRequest(t, req, http.StatusCreated)
  60. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeHelm)
  61. assert.NoError(t, err)
  62. assert.Len(t, pvs, 1)
  63. pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
  64. assert.NoError(t, err)
  65. assert.NotNil(t, pd.SemVer)
  66. assert.IsType(t, &helm_module.Metadata{}, pd.Metadata)
  67. assert.Equal(t, packageName, pd.Package.Name)
  68. assert.Equal(t, packageVersion, pd.Version.Version)
  69. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  70. assert.NoError(t, err)
  71. assert.Len(t, pfs, 1)
  72. assert.Equal(t, filename, pfs[0].Name)
  73. assert.True(t, pfs[0].IsLead)
  74. pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID)
  75. assert.NoError(t, err)
  76. assert.Equal(t, int64(len(content)), pb.Size)
  77. req = NewRequestWithBody(t, "POST", uploadURL, bytes.NewReader(content))
  78. req = AddBasicAuthHeader(req, user.Name)
  79. MakeRequest(t, req, http.StatusCreated)
  80. })
  81. t.Run("Download", func(t *testing.T) {
  82. defer PrintCurrentTest(t)()
  83. checkDownloadCount := func(count int64) {
  84. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeHelm)
  85. assert.NoError(t, err)
  86. assert.Len(t, pvs, 1)
  87. assert.Equal(t, count, pvs[0].DownloadCount)
  88. }
  89. checkDownloadCount(0)
  90. req := NewRequest(t, "GET", fmt.Sprintf("%s/%s", url, filename))
  91. req = AddBasicAuthHeader(req, user.Name)
  92. resp := MakeRequest(t, req, http.StatusOK)
  93. assert.Equal(t, content, resp.Body.Bytes())
  94. checkDownloadCount(1)
  95. })
  96. t.Run("Index", func(t *testing.T) {
  97. defer PrintCurrentTest(t)()
  98. req := NewRequest(t, "GET", fmt.Sprintf("%s/index.yaml", url))
  99. req = AddBasicAuthHeader(req, user.Name)
  100. resp := MakeRequest(t, req, http.StatusOK)
  101. type ChartVersion struct {
  102. helm_module.Metadata `yaml:",inline"`
  103. URLs []string `yaml:"urls"`
  104. Created time.Time `yaml:"created,omitempty"`
  105. Removed bool `yaml:"removed,omitempty"`
  106. Digest string `yaml:"digest,omitempty"`
  107. }
  108. type ServerInfo struct {
  109. ContextPath string `yaml:"contextPath,omitempty"`
  110. }
  111. type Index struct {
  112. APIVersion string `yaml:"apiVersion"`
  113. Entries map[string][]*ChartVersion `yaml:"entries"`
  114. Generated time.Time `yaml:"generated,omitempty"`
  115. ServerInfo *ServerInfo `yaml:"serverInfo,omitempty"`
  116. }
  117. var result Index
  118. assert.NoError(t, yaml.NewDecoder(resp.Body).Decode(&result))
  119. assert.NotEmpty(t, result.Entries)
  120. assert.Contains(t, result.Entries, packageName)
  121. cvs := result.Entries[packageName]
  122. assert.Len(t, cvs, 1)
  123. cv := cvs[0]
  124. assert.Equal(t, packageName, cv.Name)
  125. assert.Equal(t, packageVersion, cv.Version)
  126. assert.Equal(t, packageDescription, cv.Description)
  127. assert.Len(t, cv.Maintainers, 1)
  128. assert.Equal(t, packageAuthor, cv.Maintainers[0].Name)
  129. assert.Len(t, cv.Dependencies, 1)
  130. assert.ElementsMatch(t, []string{fmt.Sprintf("%s%s/%s", setting.AppURL, url[1:], filename)}, cv.URLs)
  131. assert.Equal(t, url, result.ServerInfo.ContextPath)
  132. })
  133. }