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 }