code.gitea.io/gitea@v1.22.3/modules/packages/npm/creator_test.go (about)

     1  // Copyright 2021 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package npm
     5  
     6  import (
     7  	"bytes"
     8  	"encoding/base64"
     9  	"fmt"
    10  	"strings"
    11  	"testing"
    12  
    13  	"code.gitea.io/gitea/modules/json"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  func TestParsePackage(t *testing.T) {
    19  	packageScope := "@scope"
    20  	packageName := "test-package"
    21  	packageFullName := packageScope + "/" + packageName
    22  	packageVersion := "1.0.1-pre"
    23  	packageTag := "latest"
    24  	packageAuthor := "KN4CK3R"
    25  	packageBin := "gitea"
    26  	packageDescription := "Test Description"
    27  	data := "H4sIAAAAAAAA/ytITM5OTE/VL4DQelnF+XkMVAYGBgZmJiYK2MRBwNDcSIHB2NTMwNDQzMwAqA7IMDUxA9LUdgg2UFpcklgEdAql5kD8ogCnhwio5lJQUMpLzE1VslJQcihOzi9I1S9JLS7RhSYIJR2QgrLUouLM/DyQGkM9Az1D3YIiqExKanFyUWZBCVQ2BKhVwQVJDKwosbQkI78IJO/tZ+LsbRykxFXLNdA+HwWjYBSMgpENACgAbtAACAAA"
    28  	integrity := "sha512-yA4FJsVhetynGfOC1jFf79BuS+jrHbm0fhh+aHzCQkOaOBXKf9oBnC4a6DnLLnEsHQDRLYd00cwj8sCXpC+wIg=="
    29  	repository := Repository{
    30  		Type: "gitea",
    31  		URL:  "http://localhost:3000/gitea/test.git",
    32  	}
    33  
    34  	t.Run("InvalidUpload", func(t *testing.T) {
    35  		p, err := ParsePackage(bytes.NewReader([]byte{0}))
    36  		assert.Nil(t, p)
    37  		assert.Error(t, err)
    38  	})
    39  
    40  	t.Run("InvalidUploadNoData", func(t *testing.T) {
    41  		b, _ := json.Marshal(packageUpload{})
    42  		p, err := ParsePackage(bytes.NewReader(b))
    43  		assert.Nil(t, p)
    44  		assert.ErrorIs(t, err, ErrInvalidPackage)
    45  	})
    46  
    47  	t.Run("InvalidPackageName", func(t *testing.T) {
    48  		test := func(t *testing.T, name string) {
    49  			b, _ := json.Marshal(packageUpload{
    50  				PackageMetadata: PackageMetadata{
    51  					ID:   name,
    52  					Name: name,
    53  					Versions: map[string]*PackageMetadataVersion{
    54  						packageVersion: {
    55  							Name: name,
    56  						},
    57  					},
    58  				},
    59  			})
    60  
    61  			p, err := ParsePackage(bytes.NewReader(b))
    62  			assert.Nil(t, p)
    63  			assert.ErrorIs(t, err, ErrInvalidPackageName)
    64  		}
    65  
    66  		test(t, " test ")
    67  		test(t, " test")
    68  		test(t, "test ")
    69  		test(t, "te st")
    70  		test(t, "Test")
    71  		test(t, "_test")
    72  		test(t, ".test")
    73  		test(t, "^test")
    74  		test(t, "te^st")
    75  		test(t, "te|st")
    76  		test(t, "te)(st")
    77  		test(t, "te'st")
    78  		test(t, "te!st")
    79  		test(t, "te*st")
    80  		test(t, "te~st")
    81  		test(t, "invalid/scope")
    82  		test(t, "@invalid/_name")
    83  		test(t, "@invalid/.name")
    84  	})
    85  
    86  	t.Run("ValidPackageName", func(t *testing.T) {
    87  		test := func(t *testing.T, name string) {
    88  			b, _ := json.Marshal(packageUpload{
    89  				PackageMetadata: PackageMetadata{
    90  					ID:   name,
    91  					Name: name,
    92  					Versions: map[string]*PackageMetadataVersion{
    93  						packageVersion: {
    94  							Name: name,
    95  						},
    96  					},
    97  				},
    98  			})
    99  
   100  			p, err := ParsePackage(bytes.NewReader(b))
   101  			assert.Nil(t, p)
   102  			assert.ErrorIs(t, err, ErrInvalidPackageVersion)
   103  		}
   104  
   105  		test(t, "test")
   106  		test(t, "@scope/name")
   107  		test(t, "@scope/q")
   108  		test(t, "q")
   109  		test(t, "@scope/package-name")
   110  		test(t, "@scope/package.name")
   111  		test(t, "@scope/package_name")
   112  		test(t, "123name")
   113  		test(t, "----")
   114  		test(t, packageFullName)
   115  	})
   116  
   117  	t.Run("InvalidPackageVersion", func(t *testing.T) {
   118  		version := "first-version"
   119  		b, _ := json.Marshal(packageUpload{
   120  			PackageMetadata: PackageMetadata{
   121  				ID:   packageFullName,
   122  				Name: packageFullName,
   123  				Versions: map[string]*PackageMetadataVersion{
   124  					version: {
   125  						Name:    packageFullName,
   126  						Version: version,
   127  					},
   128  				},
   129  			},
   130  		})
   131  
   132  		p, err := ParsePackage(bytes.NewReader(b))
   133  		assert.Nil(t, p)
   134  		assert.ErrorIs(t, err, ErrInvalidPackageVersion)
   135  	})
   136  
   137  	t.Run("InvalidAttachment", func(t *testing.T) {
   138  		b, _ := json.Marshal(packageUpload{
   139  			PackageMetadata: PackageMetadata{
   140  				ID:   packageFullName,
   141  				Name: packageFullName,
   142  				Versions: map[string]*PackageMetadataVersion{
   143  					packageVersion: {
   144  						Name:    packageFullName,
   145  						Version: packageVersion,
   146  					},
   147  				},
   148  			},
   149  			Attachments: map[string]*PackageAttachment{
   150  				"dummy.tgz": {},
   151  			},
   152  		})
   153  
   154  		p, err := ParsePackage(bytes.NewReader(b))
   155  		assert.Nil(t, p)
   156  		assert.ErrorIs(t, err, ErrInvalidAttachment)
   157  	})
   158  
   159  	t.Run("InvalidData", func(t *testing.T) {
   160  		filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
   161  		b, _ := json.Marshal(packageUpload{
   162  			PackageMetadata: PackageMetadata{
   163  				ID:   packageFullName,
   164  				Name: packageFullName,
   165  				Versions: map[string]*PackageMetadataVersion{
   166  					packageVersion: {
   167  						Name:    packageFullName,
   168  						Version: packageVersion,
   169  					},
   170  				},
   171  			},
   172  			Attachments: map[string]*PackageAttachment{
   173  				filename: {
   174  					Data: "/",
   175  				},
   176  			},
   177  		})
   178  
   179  		p, err := ParsePackage(bytes.NewReader(b))
   180  		assert.Nil(t, p)
   181  		assert.ErrorIs(t, err, ErrInvalidAttachment)
   182  	})
   183  
   184  	t.Run("InvalidIntegrity", func(t *testing.T) {
   185  		filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
   186  		b, _ := json.Marshal(packageUpload{
   187  			PackageMetadata: PackageMetadata{
   188  				ID:   packageFullName,
   189  				Name: packageFullName,
   190  				Versions: map[string]*PackageMetadataVersion{
   191  					packageVersion: {
   192  						Name:    packageFullName,
   193  						Version: packageVersion,
   194  						Dist: PackageDistribution{
   195  							Integrity: "sha512-test==",
   196  						},
   197  					},
   198  				},
   199  			},
   200  			Attachments: map[string]*PackageAttachment{
   201  				filename: {
   202  					Data: data,
   203  				},
   204  			},
   205  		})
   206  
   207  		p, err := ParsePackage(bytes.NewReader(b))
   208  		assert.Nil(t, p)
   209  		assert.ErrorIs(t, err, ErrInvalidIntegrity)
   210  	})
   211  
   212  	t.Run("InvalidIntegrity2", func(t *testing.T) {
   213  		filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
   214  		b, _ := json.Marshal(packageUpload{
   215  			PackageMetadata: PackageMetadata{
   216  				ID:   packageFullName,
   217  				Name: packageFullName,
   218  				Versions: map[string]*PackageMetadataVersion{
   219  					packageVersion: {
   220  						Name:    packageFullName,
   221  						Version: packageVersion,
   222  						Dist: PackageDistribution{
   223  							Integrity: integrity,
   224  						},
   225  					},
   226  				},
   227  			},
   228  			Attachments: map[string]*PackageAttachment{
   229  				filename: {
   230  					Data: base64.StdEncoding.EncodeToString([]byte("data")),
   231  				},
   232  			},
   233  		})
   234  
   235  		p, err := ParsePackage(bytes.NewReader(b))
   236  		assert.Nil(t, p)
   237  		assert.ErrorIs(t, err, ErrInvalidIntegrity)
   238  	})
   239  
   240  	t.Run("Valid", func(t *testing.T) {
   241  		filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
   242  		b, _ := json.Marshal(packageUpload{
   243  			PackageMetadata: PackageMetadata{
   244  				ID:   packageFullName,
   245  				Name: packageFullName,
   246  				DistTags: map[string]string{
   247  					packageTag: packageVersion,
   248  				},
   249  				Versions: map[string]*PackageMetadataVersion{
   250  					packageVersion: {
   251  						Name:        packageFullName,
   252  						Version:     packageVersion,
   253  						Description: packageDescription,
   254  						Author:      User{Name: packageAuthor},
   255  						License:     "MIT",
   256  						Homepage:    "https://gitea.io/",
   257  						Readme:      packageDescription,
   258  						Dependencies: map[string]string{
   259  							"package": "1.2.0",
   260  						},
   261  						Bin: map[string]string{
   262  							"bin": packageBin,
   263  						},
   264  						Dist: PackageDistribution{
   265  							Integrity: integrity,
   266  						},
   267  						Repository: repository,
   268  					},
   269  				},
   270  			},
   271  			Attachments: map[string]*PackageAttachment{
   272  				filename: {
   273  					Data: data,
   274  				},
   275  			},
   276  		})
   277  
   278  		p, err := ParsePackage(bytes.NewReader(b))
   279  		assert.NotNil(t, p)
   280  		assert.NoError(t, err)
   281  
   282  		assert.Equal(t, packageFullName, p.Name)
   283  		assert.Equal(t, packageVersion, p.Version)
   284  		assert.Equal(t, []string{packageTag}, p.DistTags)
   285  		assert.Equal(t, fmt.Sprintf("%s-%s.tgz", strings.Split(packageFullName, "/")[1], packageVersion), p.Filename)
   286  		b, _ = base64.StdEncoding.DecodeString(data)
   287  		assert.Equal(t, b, p.Data)
   288  		assert.Equal(t, packageName, p.Metadata.Name)
   289  		assert.Equal(t, packageScope, p.Metadata.Scope)
   290  		assert.Equal(t, packageDescription, p.Metadata.Description)
   291  		assert.Equal(t, packageDescription, p.Metadata.Readme)
   292  		assert.Equal(t, packageAuthor, p.Metadata.Author)
   293  		assert.Equal(t, packageBin, p.Metadata.Bin["bin"])
   294  		assert.Equal(t, "MIT", p.Metadata.License)
   295  		assert.Equal(t, "https://gitea.io/", p.Metadata.ProjectURL)
   296  		assert.Contains(t, p.Metadata.Dependencies, "package")
   297  		assert.Equal(t, "1.2.0", p.Metadata.Dependencies["package"])
   298  		assert.Equal(t, repository.Type, p.Metadata.Repository.Type)
   299  		assert.Equal(t, repository.URL, p.Metadata.Repository.URL)
   300  	})
   301  }