Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

api_packages_cran_test.go 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "archive/tar"
  6. "archive/zip"
  7. "bytes"
  8. "compress/gzip"
  9. "fmt"
  10. "net/http"
  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. cran_module "code.gitea.io/gitea/modules/packages/cran"
  17. "code.gitea.io/gitea/tests"
  18. "github.com/stretchr/testify/assert"
  19. )
  20. func TestPackageCran(t *testing.T) {
  21. defer tests.PrepareTestEnv(t)()
  22. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  23. packageName := "test.package"
  24. packageVersion := "1.0.3"
  25. packageAuthor := "KN4CK3R"
  26. packageDescription := "Gitea Test Package"
  27. createDescription := func(name, version string) []byte {
  28. var buf bytes.Buffer
  29. fmt.Fprintln(&buf, "Package:", name)
  30. fmt.Fprintln(&buf, "Version:", version)
  31. fmt.Fprintln(&buf, "Description:", packageDescription)
  32. fmt.Fprintln(&buf, "Imports: abc,\n123")
  33. fmt.Fprintln(&buf, "NeedsCompilation: yes")
  34. fmt.Fprintln(&buf, "License: MIT")
  35. fmt.Fprintln(&buf, "Author:", packageAuthor)
  36. return buf.Bytes()
  37. }
  38. url := fmt.Sprintf("/api/packages/%s/cran", user.Name)
  39. t.Run("Source", func(t *testing.T) {
  40. createArchive := func(filename string, content []byte) *bytes.Buffer {
  41. var buf bytes.Buffer
  42. gw := gzip.NewWriter(&buf)
  43. tw := tar.NewWriter(gw)
  44. hdr := &tar.Header{
  45. Name: filename,
  46. Mode: 0o600,
  47. Size: int64(len(content)),
  48. }
  49. tw.WriteHeader(hdr)
  50. tw.Write(content)
  51. tw.Close()
  52. gw.Close()
  53. return &buf
  54. }
  55. t.Run("Upload", func(t *testing.T) {
  56. defer tests.PrintCurrentTest(t)()
  57. uploadURL := url + "/src"
  58. req := NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader([]byte{}))
  59. MakeRequest(t, req, http.StatusUnauthorized)
  60. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  61. "dummy.txt",
  62. []byte{},
  63. )).AddBasicAuth(user.Name)
  64. MakeRequest(t, req, http.StatusBadRequest)
  65. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  66. "package/DESCRIPTION",
  67. createDescription(packageName, packageVersion),
  68. )).AddBasicAuth(user.Name)
  69. MakeRequest(t, req, http.StatusCreated)
  70. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeCran)
  71. assert.NoError(t, err)
  72. assert.Len(t, pvs, 1)
  73. pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
  74. assert.NoError(t, err)
  75. assert.Nil(t, pd.SemVer)
  76. assert.IsType(t, &cran_module.Metadata{}, pd.Metadata)
  77. assert.Equal(t, packageName, pd.Package.Name)
  78. assert.Equal(t, packageVersion, pd.Version.Version)
  79. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  80. assert.NoError(t, err)
  81. assert.Len(t, pfs, 1)
  82. assert.Equal(t, fmt.Sprintf("%s_%s.tar.gz", packageName, packageVersion), pfs[0].Name)
  83. assert.True(t, pfs[0].IsLead)
  84. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  85. "package/DESCRIPTION",
  86. createDescription(packageName, packageVersion),
  87. )).AddBasicAuth(user.Name)
  88. MakeRequest(t, req, http.StatusConflict)
  89. })
  90. t.Run("Download", func(t *testing.T) {
  91. defer tests.PrintCurrentTest(t)()
  92. req := NewRequest(t, "GET", fmt.Sprintf("%s/src/contrib/%s_%s.tar.gz", url, packageName, packageVersion)).
  93. AddBasicAuth(user.Name)
  94. MakeRequest(t, req, http.StatusOK)
  95. })
  96. t.Run("Enumerate", func(t *testing.T) {
  97. defer tests.PrintCurrentTest(t)()
  98. req := NewRequest(t, "GET", url+"/src/contrib/PACKAGES").
  99. AddBasicAuth(user.Name)
  100. resp := MakeRequest(t, req, http.StatusOK)
  101. assert.Contains(t, resp.Header().Get("Content-Type"), "text/plain")
  102. body := resp.Body.String()
  103. assert.Contains(t, body, fmt.Sprintf("Package: %s", packageName))
  104. assert.Contains(t, body, fmt.Sprintf("Version: %s", packageVersion))
  105. req = NewRequest(t, "GET", url+"/src/contrib/PACKAGES.gz").
  106. AddBasicAuth(user.Name)
  107. resp = MakeRequest(t, req, http.StatusOK)
  108. assert.Contains(t, resp.Header().Get("Content-Type"), "application/x-gzip")
  109. })
  110. })
  111. t.Run("Binary", func(t *testing.T) {
  112. createArchive := func(filename string, content []byte) *bytes.Buffer {
  113. var buf bytes.Buffer
  114. archive := zip.NewWriter(&buf)
  115. w, _ := archive.Create(filename)
  116. w.Write(content)
  117. archive.Close()
  118. return &buf
  119. }
  120. t.Run("Upload", func(t *testing.T) {
  121. defer tests.PrintCurrentTest(t)()
  122. uploadURL := url + "/bin"
  123. req := NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader([]byte{}))
  124. MakeRequest(t, req, http.StatusUnauthorized)
  125. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  126. "dummy.txt",
  127. []byte{},
  128. )).AddBasicAuth(user.Name)
  129. MakeRequest(t, req, http.StatusBadRequest)
  130. req = NewRequestWithBody(t, "PUT", uploadURL+"?platform=&rversion=", createArchive(
  131. "package/DESCRIPTION",
  132. createDescription(packageName, packageVersion),
  133. )).AddBasicAuth(user.Name)
  134. MakeRequest(t, req, http.StatusBadRequest)
  135. uploadURL += "?platform=windows&rversion=4.2"
  136. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  137. "package/DESCRIPTION",
  138. createDescription(packageName, packageVersion),
  139. )).AddBasicAuth(user.Name)
  140. MakeRequest(t, req, http.StatusCreated)
  141. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeCran)
  142. assert.NoError(t, err)
  143. assert.Len(t, pvs, 1)
  144. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  145. assert.NoError(t, err)
  146. assert.Len(t, pfs, 2)
  147. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  148. "package/DESCRIPTION",
  149. createDescription(packageName, packageVersion),
  150. )).AddBasicAuth(user.Name)
  151. MakeRequest(t, req, http.StatusConflict)
  152. })
  153. t.Run("Download", func(t *testing.T) {
  154. defer tests.PrintCurrentTest(t)()
  155. cases := []struct {
  156. Platform string
  157. RVersion string
  158. ExpectedStatus int
  159. }{
  160. {"osx", "4.2", http.StatusNotFound},
  161. {"windows", "4.1", http.StatusNotFound},
  162. {"windows", "4.2", http.StatusOK},
  163. }
  164. for _, c := range cases {
  165. req := NewRequest(t, "GET", fmt.Sprintf("%s/bin/%s/contrib/%s/%s_%s.zip", url, c.Platform, c.RVersion, packageName, packageVersion)).
  166. AddBasicAuth(user.Name)
  167. MakeRequest(t, req, c.ExpectedStatus)
  168. }
  169. })
  170. t.Run("Enumerate", func(t *testing.T) {
  171. defer tests.PrintCurrentTest(t)()
  172. req := NewRequest(t, "GET", url+"/bin/windows/contrib/4.1/PACKAGES")
  173. MakeRequest(t, req, http.StatusNotFound)
  174. req = NewRequest(t, "GET", url+"/bin/windows/contrib/4.2/PACKAGES").
  175. AddBasicAuth(user.Name)
  176. resp := MakeRequest(t, req, http.StatusOK)
  177. assert.Contains(t, resp.Header().Get("Content-Type"), "text/plain")
  178. body := resp.Body.String()
  179. assert.Contains(t, body, fmt.Sprintf("Package: %s", packageName))
  180. assert.Contains(t, body, fmt.Sprintf("Version: %s", packageVersion))
  181. req = NewRequest(t, "GET", url+"/bin/windows/contrib/4.2/PACKAGES.gz").
  182. AddBasicAuth(user.Name)
  183. resp = MakeRequest(t, req, http.StatusOK)
  184. assert.Contains(t, resp.Header().Get("Content-Type"), "application/x-gzip")
  185. })
  186. })
  187. }