Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

api_packages_generic_test.go 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "bytes"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "testing"
  10. "code.gitea.io/gitea/models/db"
  11. "code.gitea.io/gitea/models/packages"
  12. "code.gitea.io/gitea/models/unittest"
  13. user_model "code.gitea.io/gitea/models/user"
  14. "code.gitea.io/gitea/modules/setting"
  15. "code.gitea.io/gitea/tests"
  16. "github.com/stretchr/testify/assert"
  17. )
  18. func TestPackageGeneric(t *testing.T) {
  19. defer tests.PrepareTestEnv(t)()
  20. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  21. packageName := "te-st_pac.kage"
  22. packageVersion := "1.0.3-te st"
  23. filename := "fi-le_na.me"
  24. content := []byte{1, 2, 3}
  25. url := fmt.Sprintf("/api/packages/%s/generic/%s/%s", user.Name, packageName, packageVersion)
  26. t.Run("Upload", func(t *testing.T) {
  27. defer tests.PrintCurrentTest(t)()
  28. req := NewRequestWithBody(t, "PUT", url+"/"+filename, bytes.NewReader(content)).
  29. AddBasicAuth(user.Name)
  30. MakeRequest(t, req, http.StatusCreated)
  31. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeGeneric)
  32. assert.NoError(t, err)
  33. assert.Len(t, pvs, 1)
  34. pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
  35. assert.NoError(t, err)
  36. assert.Nil(t, pd.Metadata)
  37. assert.Equal(t, packageName, pd.Package.Name)
  38. assert.Equal(t, packageVersion, pd.Version.Version)
  39. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  40. assert.NoError(t, err)
  41. assert.Len(t, pfs, 1)
  42. assert.Equal(t, filename, pfs[0].Name)
  43. assert.True(t, pfs[0].IsLead)
  44. pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID)
  45. assert.NoError(t, err)
  46. assert.Equal(t, int64(len(content)), pb.Size)
  47. t.Run("Exists", func(t *testing.T) {
  48. defer tests.PrintCurrentTest(t)()
  49. req := NewRequestWithBody(t, "PUT", url+"/"+filename, bytes.NewReader(content)).
  50. AddBasicAuth(user.Name)
  51. MakeRequest(t, req, http.StatusConflict)
  52. })
  53. t.Run("Additional", func(t *testing.T) {
  54. defer tests.PrintCurrentTest(t)()
  55. req := NewRequestWithBody(t, "PUT", url+"/dummy.bin", bytes.NewReader(content)).
  56. AddBasicAuth(user.Name)
  57. MakeRequest(t, req, http.StatusCreated)
  58. // Check deduplication
  59. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  60. assert.NoError(t, err)
  61. assert.Len(t, pfs, 2)
  62. assert.Equal(t, pfs[0].BlobID, pfs[1].BlobID)
  63. })
  64. t.Run("InvalidParameter", func(t *testing.T) {
  65. defer tests.PrintCurrentTest(t)()
  66. req := NewRequestWithBody(t, "PUT", fmt.Sprintf("/api/packages/%s/generic/%s/%s/%s", user.Name, "invalid package name", packageVersion, filename), bytes.NewReader(content)).
  67. AddBasicAuth(user.Name)
  68. MakeRequest(t, req, http.StatusBadRequest)
  69. req = NewRequestWithBody(t, "PUT", fmt.Sprintf("/api/packages/%s/generic/%s/%s/%s", user.Name, packageName, "%20test ", filename), bytes.NewReader(content)).
  70. AddBasicAuth(user.Name)
  71. MakeRequest(t, req, http.StatusBadRequest)
  72. req = NewRequestWithBody(t, "PUT", fmt.Sprintf("/api/packages/%s/generic/%s/%s/%s", user.Name, packageName, packageVersion, "inva|id.name"), bytes.NewReader(content)).
  73. AddBasicAuth(user.Name)
  74. MakeRequest(t, req, http.StatusBadRequest)
  75. })
  76. })
  77. t.Run("Download", func(t *testing.T) {
  78. defer tests.PrintCurrentTest(t)()
  79. checkDownloadCount := func(count int64) {
  80. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeGeneric)
  81. assert.NoError(t, err)
  82. assert.Len(t, pvs, 1)
  83. assert.Equal(t, count, pvs[0].DownloadCount)
  84. }
  85. checkDownloadCount(0)
  86. req := NewRequest(t, "GET", url+"/"+filename)
  87. resp := MakeRequest(t, req, http.StatusOK)
  88. assert.Equal(t, content, resp.Body.Bytes())
  89. checkDownloadCount(1)
  90. req = NewRequest(t, "GET", url+"/dummy.bin")
  91. MakeRequest(t, req, http.StatusOK)
  92. checkDownloadCount(2)
  93. t.Run("NotExists", func(t *testing.T) {
  94. defer tests.PrintCurrentTest(t)()
  95. req := NewRequest(t, "GET", url+"/not.found")
  96. MakeRequest(t, req, http.StatusNotFound)
  97. })
  98. t.Run("RequireSignInView", func(t *testing.T) {
  99. defer tests.PrintCurrentTest(t)()
  100. setting.Service.RequireSignInView = true
  101. defer func() {
  102. setting.Service.RequireSignInView = false
  103. }()
  104. req = NewRequest(t, "GET", url+"/dummy.bin")
  105. MakeRequest(t, req, http.StatusUnauthorized)
  106. })
  107. t.Run("ServeDirect", func(t *testing.T) {
  108. defer tests.PrintCurrentTest(t)()
  109. if setting.Packages.Storage.Type != setting.MinioStorageType {
  110. t.Skip("Test skipped for non-Minio-storage.")
  111. return
  112. }
  113. if !setting.Packages.Storage.MinioConfig.ServeDirect {
  114. old := setting.Packages.Storage.MinioConfig.ServeDirect
  115. defer func() {
  116. setting.Packages.Storage.MinioConfig.ServeDirect = old
  117. }()
  118. setting.Packages.Storage.MinioConfig.ServeDirect = true
  119. }
  120. req := NewRequest(t, "GET", url+"/"+filename)
  121. resp := MakeRequest(t, req, http.StatusSeeOther)
  122. checkDownloadCount(3)
  123. location := resp.Header().Get("Location")
  124. assert.NotEmpty(t, location)
  125. resp2, err := (&http.Client{}).Get(location)
  126. assert.NoError(t, err)
  127. assert.Equal(t, http.StatusOK, resp2.StatusCode)
  128. body, err := io.ReadAll(resp2.Body)
  129. assert.NoError(t, err)
  130. assert.Equal(t, content, body)
  131. checkDownloadCount(3)
  132. })
  133. })
  134. t.Run("Delete", func(t *testing.T) {
  135. defer tests.PrintCurrentTest(t)()
  136. t.Run("File", func(t *testing.T) {
  137. defer tests.PrintCurrentTest(t)()
  138. req := NewRequest(t, "DELETE", url+"/"+filename)
  139. MakeRequest(t, req, http.StatusUnauthorized)
  140. req = NewRequest(t, "DELETE", url+"/"+filename).
  141. AddBasicAuth(user.Name)
  142. MakeRequest(t, req, http.StatusNoContent)
  143. req = NewRequest(t, "GET", url+"/"+filename)
  144. MakeRequest(t, req, http.StatusNotFound)
  145. req = NewRequest(t, "DELETE", url+"/"+filename).
  146. AddBasicAuth(user.Name)
  147. MakeRequest(t, req, http.StatusNotFound)
  148. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeGeneric)
  149. assert.NoError(t, err)
  150. assert.Len(t, pvs, 1)
  151. t.Run("RemovesVersion", func(t *testing.T) {
  152. defer tests.PrintCurrentTest(t)()
  153. req = NewRequest(t, "DELETE", url+"/dummy.bin").
  154. AddBasicAuth(user.Name)
  155. MakeRequest(t, req, http.StatusNoContent)
  156. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeGeneric)
  157. assert.NoError(t, err)
  158. assert.Empty(t, pvs)
  159. })
  160. })
  161. t.Run("Version", func(t *testing.T) {
  162. defer tests.PrintCurrentTest(t)()
  163. req := NewRequestWithBody(t, "PUT", url+"/"+filename, bytes.NewReader(content)).
  164. AddBasicAuth(user.Name)
  165. MakeRequest(t, req, http.StatusCreated)
  166. req = NewRequest(t, "DELETE", url)
  167. MakeRequest(t, req, http.StatusUnauthorized)
  168. req = NewRequest(t, "DELETE", url).
  169. AddBasicAuth(user.Name)
  170. MakeRequest(t, req, http.StatusNoContent)
  171. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeGeneric)
  172. assert.NoError(t, err)
  173. assert.Empty(t, pvs)
  174. req = NewRequest(t, "GET", url+"/"+filename)
  175. MakeRequest(t, req, http.StatusNotFound)
  176. req = NewRequest(t, "DELETE", url).
  177. AddBasicAuth(user.Name)
  178. MakeRequest(t, req, http.StatusNotFound)
  179. })
  180. })
  181. }