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_cran_test.go 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. ))
  64. req = AddBasicAuthHeader(req, user.Name)
  65. MakeRequest(t, req, http.StatusBadRequest)
  66. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  67. "package/DESCRIPTION",
  68. createDescription(packageName, packageVersion),
  69. ))
  70. req = AddBasicAuthHeader(req, user.Name)
  71. MakeRequest(t, req, http.StatusCreated)
  72. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeCran)
  73. assert.NoError(t, err)
  74. assert.Len(t, pvs, 1)
  75. pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
  76. assert.NoError(t, err)
  77. assert.Nil(t, pd.SemVer)
  78. assert.IsType(t, &cran_module.Metadata{}, pd.Metadata)
  79. assert.Equal(t, packageName, pd.Package.Name)
  80. assert.Equal(t, packageVersion, pd.Version.Version)
  81. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  82. assert.NoError(t, err)
  83. assert.Len(t, pfs, 1)
  84. assert.Equal(t, fmt.Sprintf("%s_%s.tar.gz", packageName, packageVersion), pfs[0].Name)
  85. assert.True(t, pfs[0].IsLead)
  86. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  87. "package/DESCRIPTION",
  88. createDescription(packageName, packageVersion),
  89. ))
  90. req = AddBasicAuthHeader(req, user.Name)
  91. MakeRequest(t, req, http.StatusConflict)
  92. })
  93. t.Run("Download", func(t *testing.T) {
  94. defer tests.PrintCurrentTest(t)()
  95. req := NewRequest(t, "GET", fmt.Sprintf("%s/src/contrib/%s_%s.tar.gz", url, packageName, packageVersion))
  96. req = AddBasicAuthHeader(req, user.Name)
  97. MakeRequest(t, req, http.StatusOK)
  98. })
  99. t.Run("Enumerate", func(t *testing.T) {
  100. defer tests.PrintCurrentTest(t)()
  101. req := NewRequest(t, "GET", url+"/src/contrib/PACKAGES")
  102. req = AddBasicAuthHeader(req, user.Name)
  103. resp := MakeRequest(t, req, http.StatusOK)
  104. assert.Contains(t, resp.Header().Get("Content-Type"), "text/plain")
  105. body := resp.Body.String()
  106. assert.Contains(t, body, fmt.Sprintf("Package: %s", packageName))
  107. assert.Contains(t, body, fmt.Sprintf("Version: %s", packageVersion))
  108. req = NewRequest(t, "GET", url+"/src/contrib/PACKAGES.gz")
  109. req = AddBasicAuthHeader(req, user.Name)
  110. resp = MakeRequest(t, req, http.StatusOK)
  111. assert.Contains(t, resp.Header().Get("Content-Type"), "application/x-gzip")
  112. })
  113. })
  114. t.Run("Binary", func(t *testing.T) {
  115. createArchive := func(filename string, content []byte) *bytes.Buffer {
  116. var buf bytes.Buffer
  117. archive := zip.NewWriter(&buf)
  118. w, _ := archive.Create(filename)
  119. w.Write(content)
  120. archive.Close()
  121. return &buf
  122. }
  123. t.Run("Upload", func(t *testing.T) {
  124. defer tests.PrintCurrentTest(t)()
  125. uploadURL := url + "/bin"
  126. req := NewRequestWithBody(t, "PUT", uploadURL, bytes.NewReader([]byte{}))
  127. MakeRequest(t, req, http.StatusUnauthorized)
  128. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  129. "dummy.txt",
  130. []byte{},
  131. ))
  132. req = AddBasicAuthHeader(req, user.Name)
  133. MakeRequest(t, req, http.StatusBadRequest)
  134. req = NewRequestWithBody(t, "PUT", uploadURL+"?platform=&rversion=", createArchive(
  135. "package/DESCRIPTION",
  136. createDescription(packageName, packageVersion),
  137. ))
  138. req = AddBasicAuthHeader(req, user.Name)
  139. MakeRequest(t, req, http.StatusBadRequest)
  140. uploadURL += "?platform=windows&rversion=4.2"
  141. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  142. "package/DESCRIPTION",
  143. createDescription(packageName, packageVersion),
  144. ))
  145. req = AddBasicAuthHeader(req, user.Name)
  146. MakeRequest(t, req, http.StatusCreated)
  147. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeCran)
  148. assert.NoError(t, err)
  149. assert.Len(t, pvs, 1)
  150. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  151. assert.NoError(t, err)
  152. assert.Len(t, pfs, 2)
  153. req = NewRequestWithBody(t, "PUT", uploadURL, createArchive(
  154. "package/DESCRIPTION",
  155. createDescription(packageName, packageVersion),
  156. ))
  157. req = AddBasicAuthHeader(req, user.Name)
  158. MakeRequest(t, req, http.StatusConflict)
  159. })
  160. t.Run("Download", func(t *testing.T) {
  161. defer tests.PrintCurrentTest(t)()
  162. cases := []struct {
  163. Platform string
  164. RVersion string
  165. ExpectedStatus int
  166. }{
  167. {"osx", "4.2", http.StatusNotFound},
  168. {"windows", "4.1", http.StatusNotFound},
  169. {"windows", "4.2", http.StatusOK},
  170. }
  171. for _, c := range cases {
  172. req := NewRequest(t, "GET", fmt.Sprintf("%s/bin/%s/contrib/%s/%s_%s.zip", url, c.Platform, c.RVersion, packageName, packageVersion))
  173. req = AddBasicAuthHeader(req, user.Name)
  174. MakeRequest(t, req, c.ExpectedStatus)
  175. }
  176. })
  177. t.Run("Enumerate", func(t *testing.T) {
  178. defer tests.PrintCurrentTest(t)()
  179. req := NewRequest(t, "GET", url+"/bin/windows/contrib/4.1/PACKAGES")
  180. MakeRequest(t, req, http.StatusNotFound)
  181. req = NewRequest(t, "GET", url+"/bin/windows/contrib/4.2/PACKAGES")
  182. req = AddBasicAuthHeader(req, user.Name)
  183. resp := MakeRequest(t, req, http.StatusOK)
  184. assert.Contains(t, resp.Header().Get("Content-Type"), "text/plain")
  185. body := resp.Body.String()
  186. assert.Contains(t, body, fmt.Sprintf("Package: %s", packageName))
  187. assert.Contains(t, body, fmt.Sprintf("Version: %s", packageVersion))
  188. req = NewRequest(t, "GET", url+"/bin/windows/contrib/4.2/PACKAGES.gz")
  189. req = AddBasicAuthHeader(req, user.Name)
  190. resp = MakeRequest(t, req, http.StatusOK)
  191. assert.Contains(t, resp.Header().Get("Content-Type"), "application/x-gzip")
  192. })
  193. })
  194. }