code.gitea.io/gitea@v1.19.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  
    30  	t.Run("InvalidUpload", func(t *testing.T) {
    31  		p, err := ParsePackage(bytes.NewReader([]byte{0}))
    32  		assert.Nil(t, p)
    33  		assert.Error(t, err)
    34  	})
    35  
    36  	t.Run("InvalidUploadNoData", func(t *testing.T) {
    37  		b, _ := json.Marshal(packageUpload{})
    38  		p, err := ParsePackage(bytes.NewReader(b))
    39  		assert.Nil(t, p)
    40  		assert.ErrorIs(t, err, ErrInvalidPackage)
    41  	})
    42  
    43  	t.Run("InvalidPackageName", func(t *testing.T) {
    44  		test := func(t *testing.T, name string) {
    45  			b, _ := json.Marshal(packageUpload{
    46  				PackageMetadata: PackageMetadata{
    47  					ID:   name,
    48  					Name: name,
    49  					Versions: map[string]*PackageMetadataVersion{
    50  						packageVersion: {
    51  							Name: name,
    52  						},
    53  					},
    54  				},
    55  			})
    56  
    57  			p, err := ParsePackage(bytes.NewReader(b))
    58  			assert.Nil(t, p)
    59  			assert.ErrorIs(t, err, ErrInvalidPackageName)
    60  		}
    61  
    62  		test(t, " test ")
    63  		test(t, " test")
    64  		test(t, "test ")
    65  		test(t, "te st")
    66  		test(t, "invalid/scope")
    67  		test(t, "@invalid/_name")
    68  		test(t, "@invalid/.name")
    69  	})
    70  
    71  	t.Run("ValidPackageName", func(t *testing.T) {
    72  		test := func(t *testing.T, name string) {
    73  			b, _ := json.Marshal(packageUpload{
    74  				PackageMetadata: PackageMetadata{
    75  					ID:   name,
    76  					Name: name,
    77  					Versions: map[string]*PackageMetadataVersion{
    78  						packageVersion: {
    79  							Name: name,
    80  						},
    81  					},
    82  				},
    83  			})
    84  
    85  			p, err := ParsePackage(bytes.NewReader(b))
    86  			assert.Nil(t, p)
    87  			assert.ErrorIs(t, err, ErrInvalidPackageVersion)
    88  		}
    89  
    90  		test(t, "test")
    91  		test(t, "@scope/name")
    92  		test(t, packageFullName)
    93  	})
    94  
    95  	t.Run("InvalidPackageVersion", func(t *testing.T) {
    96  		version := "first-version"
    97  		b, _ := json.Marshal(packageUpload{
    98  			PackageMetadata: PackageMetadata{
    99  				ID:   packageFullName,
   100  				Name: packageFullName,
   101  				Versions: map[string]*PackageMetadataVersion{
   102  					version: {
   103  						Name:    packageFullName,
   104  						Version: version,
   105  					},
   106  				},
   107  			},
   108  		})
   109  
   110  		p, err := ParsePackage(bytes.NewReader(b))
   111  		assert.Nil(t, p)
   112  		assert.ErrorIs(t, err, ErrInvalidPackageVersion)
   113  	})
   114  
   115  	t.Run("InvalidAttachment", func(t *testing.T) {
   116  		b, _ := json.Marshal(packageUpload{
   117  			PackageMetadata: PackageMetadata{
   118  				ID:   packageFullName,
   119  				Name: packageFullName,
   120  				Versions: map[string]*PackageMetadataVersion{
   121  					packageVersion: {
   122  						Name:    packageFullName,
   123  						Version: packageVersion,
   124  					},
   125  				},
   126  			},
   127  			Attachments: map[string]*PackageAttachment{
   128  				"dummy.tgz": {},
   129  			},
   130  		})
   131  
   132  		p, err := ParsePackage(bytes.NewReader(b))
   133  		assert.Nil(t, p)
   134  		assert.ErrorIs(t, err, ErrInvalidAttachment)
   135  	})
   136  
   137  	t.Run("InvalidData", func(t *testing.T) {
   138  		filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
   139  		b, _ := json.Marshal(packageUpload{
   140  			PackageMetadata: PackageMetadata{
   141  				ID:   packageFullName,
   142  				Name: packageFullName,
   143  				Versions: map[string]*PackageMetadataVersion{
   144  					packageVersion: {
   145  						Name:    packageFullName,
   146  						Version: packageVersion,
   147  					},
   148  				},
   149  			},
   150  			Attachments: map[string]*PackageAttachment{
   151  				filename: {
   152  					Data: "/",
   153  				},
   154  			},
   155  		})
   156  
   157  		p, err := ParsePackage(bytes.NewReader(b))
   158  		assert.Nil(t, p)
   159  		assert.ErrorIs(t, err, ErrInvalidAttachment)
   160  	})
   161  
   162  	t.Run("InvalidIntegrity", func(t *testing.T) {
   163  		filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
   164  		b, _ := json.Marshal(packageUpload{
   165  			PackageMetadata: PackageMetadata{
   166  				ID:   packageFullName,
   167  				Name: packageFullName,
   168  				Versions: map[string]*PackageMetadataVersion{
   169  					packageVersion: {
   170  						Name:    packageFullName,
   171  						Version: packageVersion,
   172  						Dist: PackageDistribution{
   173  							Integrity: "sha512-test==",
   174  						},
   175  					},
   176  				},
   177  			},
   178  			Attachments: map[string]*PackageAttachment{
   179  				filename: {
   180  					Data: data,
   181  				},
   182  			},
   183  		})
   184  
   185  		p, err := ParsePackage(bytes.NewReader(b))
   186  		assert.Nil(t, p)
   187  		assert.ErrorIs(t, err, ErrInvalidIntegrity)
   188  	})
   189  
   190  	t.Run("InvalidIntegrity2", func(t *testing.T) {
   191  		filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
   192  		b, _ := json.Marshal(packageUpload{
   193  			PackageMetadata: PackageMetadata{
   194  				ID:   packageFullName,
   195  				Name: packageFullName,
   196  				Versions: map[string]*PackageMetadataVersion{
   197  					packageVersion: {
   198  						Name:    packageFullName,
   199  						Version: packageVersion,
   200  						Dist: PackageDistribution{
   201  							Integrity: integrity,
   202  						},
   203  					},
   204  				},
   205  			},
   206  			Attachments: map[string]*PackageAttachment{
   207  				filename: {
   208  					Data: base64.StdEncoding.EncodeToString([]byte("data")),
   209  				},
   210  			},
   211  		})
   212  
   213  		p, err := ParsePackage(bytes.NewReader(b))
   214  		assert.Nil(t, p)
   215  		assert.ErrorIs(t, err, ErrInvalidIntegrity)
   216  	})
   217  
   218  	t.Run("Valid", func(t *testing.T) {
   219  		filename := fmt.Sprintf("%s-%s.tgz", packageFullName, packageVersion)
   220  		b, _ := json.Marshal(packageUpload{
   221  			PackageMetadata: PackageMetadata{
   222  				ID:   packageFullName,
   223  				Name: packageFullName,
   224  				DistTags: map[string]string{
   225  					packageTag: packageVersion,
   226  				},
   227  				Versions: map[string]*PackageMetadataVersion{
   228  					packageVersion: {
   229  						Name:        packageFullName,
   230  						Version:     packageVersion,
   231  						Description: packageDescription,
   232  						Author:      User{Name: packageAuthor},
   233  						License:     "MIT",
   234  						Homepage:    "https://gitea.io/",
   235  						Readme:      packageDescription,
   236  						Dependencies: map[string]string{
   237  							"package": "1.2.0",
   238  						},
   239  						Bin: map[string]string{
   240  							"bin": packageBin,
   241  						},
   242  						Dist: PackageDistribution{
   243  							Integrity: integrity,
   244  						},
   245  					},
   246  				},
   247  			},
   248  			Attachments: map[string]*PackageAttachment{
   249  				filename: {
   250  					Data: data,
   251  				},
   252  			},
   253  		})
   254  
   255  		p, err := ParsePackage(bytes.NewReader(b))
   256  		assert.NotNil(t, p)
   257  		assert.NoError(t, err)
   258  
   259  		assert.Equal(t, packageFullName, p.Name)
   260  		assert.Equal(t, packageVersion, p.Version)
   261  		assert.Equal(t, []string{packageTag}, p.DistTags)
   262  		assert.Equal(t, fmt.Sprintf("%s-%s.tgz", strings.Split(packageFullName, "/")[1], packageVersion), p.Filename)
   263  		b, _ = base64.StdEncoding.DecodeString(data)
   264  		assert.Equal(t, b, p.Data)
   265  		assert.Equal(t, packageName, p.Metadata.Name)
   266  		assert.Equal(t, packageScope, p.Metadata.Scope)
   267  		assert.Equal(t, packageDescription, p.Metadata.Description)
   268  		assert.Equal(t, packageDescription, p.Metadata.Readme)
   269  		assert.Equal(t, packageAuthor, p.Metadata.Author)
   270  		assert.Equal(t, packageBin, p.Metadata.Bin["bin"])
   271  		assert.Equal(t, "MIT", p.Metadata.License)
   272  		assert.Equal(t, "https://gitea.io/", p.Metadata.ProjectURL)
   273  		assert.Contains(t, p.Metadata.Dependencies, "package")
   274  		assert.Equal(t, "1.2.0", p.Metadata.Dependencies["package"])
   275  	})
   276  }