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_goproxy_test.go 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "archive/zip"
  6. "bytes"
  7. "fmt"
  8. "net/http"
  9. "testing"
  10. "time"
  11. "code.gitea.io/gitea/models/db"
  12. "code.gitea.io/gitea/models/packages"
  13. "code.gitea.io/gitea/models/unittest"
  14. user_model "code.gitea.io/gitea/models/user"
  15. "code.gitea.io/gitea/tests"
  16. "github.com/stretchr/testify/assert"
  17. )
  18. func TestPackageGo(t *testing.T) {
  19. defer tests.PrepareTestEnv(t)()
  20. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  21. packageName := "gitea.com/go-gitea/gitea"
  22. packageVersion := "v0.0.1"
  23. packageVersion2 := "v0.0.2"
  24. goModContent := `module "gitea.com/go-gitea/gitea"`
  25. createArchive := func(files map[string][]byte) []byte {
  26. var buf bytes.Buffer
  27. zw := zip.NewWriter(&buf)
  28. for name, content := range files {
  29. w, _ := zw.Create(name)
  30. w.Write(content)
  31. }
  32. zw.Close()
  33. return buf.Bytes()
  34. }
  35. url := fmt.Sprintf("/api/packages/%s/go", user.Name)
  36. t.Run("Upload", func(t *testing.T) {
  37. defer tests.PrintCurrentTest(t)()
  38. content := createArchive(nil)
  39. req := NewRequestWithBody(t, "PUT", url+"/upload", bytes.NewReader(content))
  40. MakeRequest(t, req, http.StatusUnauthorized)
  41. req = NewRequestWithBody(t, "PUT", url+"/upload", bytes.NewReader(content))
  42. AddBasicAuthHeader(req, user.Name)
  43. MakeRequest(t, req, http.StatusBadRequest)
  44. content = createArchive(map[string][]byte{
  45. packageName + "@" + packageVersion + "/go.mod": []byte(goModContent),
  46. })
  47. req = NewRequestWithBody(t, "PUT", url+"/upload", bytes.NewReader(content))
  48. AddBasicAuthHeader(req, user.Name)
  49. MakeRequest(t, req, http.StatusCreated)
  50. pvs, err := packages.GetVersionsByPackageType(db.DefaultContext, user.ID, packages.TypeGo)
  51. assert.NoError(t, err)
  52. assert.Len(t, pvs, 1)
  53. pd, err := packages.GetPackageDescriptor(db.DefaultContext, pvs[0])
  54. assert.NoError(t, err)
  55. assert.Nil(t, pd.Metadata)
  56. assert.Equal(t, packageName, pd.Package.Name)
  57. assert.Equal(t, packageVersion, pd.Version.Version)
  58. pfs, err := packages.GetFilesByVersionID(db.DefaultContext, pvs[0].ID)
  59. assert.NoError(t, err)
  60. assert.Len(t, pfs, 1)
  61. assert.Equal(t, packageVersion+".zip", pfs[0].Name)
  62. assert.True(t, pfs[0].IsLead)
  63. pb, err := packages.GetBlobByID(db.DefaultContext, pfs[0].BlobID)
  64. assert.NoError(t, err)
  65. assert.Equal(t, int64(len(content)), pb.Size)
  66. req = NewRequestWithBody(t, "PUT", url+"/upload", bytes.NewReader(content))
  67. AddBasicAuthHeader(req, user.Name)
  68. MakeRequest(t, req, http.StatusConflict)
  69. time.Sleep(time.Second)
  70. content = createArchive(map[string][]byte{
  71. packageName + "@" + packageVersion2 + "/go.mod": []byte(goModContent),
  72. })
  73. req = NewRequestWithBody(t, "PUT", url+"/upload", bytes.NewReader(content))
  74. AddBasicAuthHeader(req, user.Name)
  75. MakeRequest(t, req, http.StatusCreated)
  76. })
  77. t.Run("List", func(t *testing.T) {
  78. defer tests.PrintCurrentTest(t)()
  79. req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/@v/list", url, packageName))
  80. resp := MakeRequest(t, req, http.StatusOK)
  81. assert.Equal(t, packageVersion+"\n"+packageVersion2+"\n", resp.Body.String())
  82. })
  83. t.Run("Info", func(t *testing.T) {
  84. defer tests.PrintCurrentTest(t)()
  85. req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/@v/%s.info", url, packageName, packageVersion))
  86. resp := MakeRequest(t, req, http.StatusOK)
  87. type Info struct {
  88. Version string `json:"Version"`
  89. Time time.Time `json:"Time"`
  90. }
  91. info := &Info{}
  92. DecodeJSON(t, resp, &info)
  93. assert.Equal(t, packageVersion, info.Version)
  94. req = NewRequest(t, "GET", fmt.Sprintf("%s/%s/@v/latest.info", url, packageName))
  95. resp = MakeRequest(t, req, http.StatusOK)
  96. info = &Info{}
  97. DecodeJSON(t, resp, &info)
  98. assert.Equal(t, packageVersion2, info.Version)
  99. req = NewRequest(t, "GET", fmt.Sprintf("%s/%s/@latest", url, packageName))
  100. resp = MakeRequest(t, req, http.StatusOK)
  101. info = &Info{}
  102. DecodeJSON(t, resp, &info)
  103. assert.Equal(t, packageVersion2, info.Version)
  104. })
  105. t.Run("GoMod", func(t *testing.T) {
  106. defer tests.PrintCurrentTest(t)()
  107. req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/@v/%s.mod", url, packageName, packageVersion))
  108. resp := MakeRequest(t, req, http.StatusOK)
  109. assert.Equal(t, goModContent, resp.Body.String())
  110. req = NewRequest(t, "GET", fmt.Sprintf("%s/%s/@v/latest.mod", url, packageName))
  111. resp = MakeRequest(t, req, http.StatusOK)
  112. assert.Equal(t, goModContent, resp.Body.String())
  113. })
  114. t.Run("Download", func(t *testing.T) {
  115. defer tests.PrintCurrentTest(t)()
  116. req := NewRequest(t, "GET", fmt.Sprintf("%s/%s/@v/%s.zip", url, packageName, packageVersion))
  117. MakeRequest(t, req, http.StatusOK)
  118. req = NewRequest(t, "GET", fmt.Sprintf("%s/%s/@v/latest.zip", url, packageName))
  119. MakeRequest(t, req, http.StatusOK)
  120. })
  121. }