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