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 }