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  }