github.com/anchore/syft@v1.4.2-0.20240516191711-1bec1fc5d397/syft/pkg/cataloger/javascript/parse_package_json_test.go (about) 1 package javascript 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 8 "github.com/anchore/syft/syft/file" 9 "github.com/anchore/syft/syft/pkg" 10 "github.com/anchore/syft/syft/pkg/cataloger/internal/pkgtest" 11 ) 12 13 func TestParsePackageJSON(t *testing.T) { 14 tests := []struct { 15 Fixture string 16 ExpectedPkg pkg.Package 17 }{ 18 { 19 Fixture: "test-fixtures/pkg-json/package.json", 20 ExpectedPkg: pkg.Package{ 21 Name: "npm", 22 Version: "6.14.6", 23 PURL: "pkg:npm/npm@6.14.6", 24 Type: pkg.NpmPkg, 25 Language: pkg.JavaScript, 26 Licenses: pkg.NewLicenseSet( 27 pkg.NewLicenseFromLocations("Artistic-2.0", file.NewLocation("test-fixtures/pkg-json/package.json")), 28 ), 29 Metadata: pkg.NpmPackage{ 30 Name: "npm", 31 Version: "6.14.6", 32 Author: "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", 33 Homepage: "https://docs.npmjs.com/", 34 URL: "https://github.com/npm/cli", 35 Description: "a package manager for JavaScript", 36 }, 37 }, 38 }, 39 { 40 Fixture: "test-fixtures/pkg-json/package-license-object.json", 41 ExpectedPkg: pkg.Package{ 42 Name: "npm", 43 Version: "6.14.6", 44 PURL: "pkg:npm/npm@6.14.6", 45 Type: pkg.NpmPkg, 46 Language: pkg.JavaScript, 47 Licenses: pkg.NewLicenseSet( 48 pkg.NewLicenseFromLocations("ISC", file.NewLocation("test-fixtures/pkg-json/package-license-object.json")), 49 ), 50 Metadata: pkg.NpmPackage{ 51 Name: "npm", 52 Version: "6.14.6", 53 Author: "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", 54 Homepage: "https://docs.npmjs.com/", 55 URL: "https://github.com/npm/cli", 56 Description: "a package manager for JavaScript", 57 }, 58 }, 59 }, 60 { 61 Fixture: "test-fixtures/pkg-json/package-license-objects.json", 62 ExpectedPkg: pkg.Package{ 63 Name: "npm", 64 Version: "6.14.6", 65 PURL: "pkg:npm/npm@6.14.6", 66 Type: pkg.NpmPkg, 67 Licenses: pkg.NewLicenseSet( 68 pkg.NewLicenseFromLocations("MIT", file.NewLocation("test-fixtures/pkg-json/package-license-objects.json")), 69 pkg.NewLicenseFromLocations("Apache-2.0", file.NewLocation("test-fixtures/pkg-json/package-license-objects.json")), 70 ), 71 Language: pkg.JavaScript, 72 Metadata: pkg.NpmPackage{ 73 Name: "npm", 74 Version: "6.14.6", 75 Author: "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", 76 Homepage: "https://docs.npmjs.com/", 77 URL: "https://github.com/npm/cli", 78 Description: "a package manager for JavaScript", 79 }, 80 }, 81 }, 82 { 83 Fixture: "test-fixtures/pkg-json/package-malformed-license.json", 84 ExpectedPkg: pkg.Package{ 85 Name: "npm", 86 Version: "6.14.6", 87 PURL: "pkg:npm/npm@6.14.6", 88 Type: pkg.NpmPkg, 89 Language: pkg.JavaScript, 90 Metadata: pkg.NpmPackage{ 91 Name: "npm", 92 Version: "6.14.6", 93 Author: "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", 94 Homepage: "https://docs.npmjs.com/", 95 URL: "https://github.com/npm/cli", 96 Description: "a package manager for JavaScript", 97 }, 98 }, 99 }, 100 { 101 Fixture: "test-fixtures/pkg-json/package-no-license.json", 102 ExpectedPkg: pkg.Package{ 103 Name: "npm", 104 Version: "6.14.6", 105 PURL: "pkg:npm/npm@6.14.6", 106 Type: pkg.NpmPkg, 107 Language: pkg.JavaScript, 108 Metadata: pkg.NpmPackage{ 109 Name: "npm", 110 Version: "6.14.6", 111 Author: "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", 112 Homepage: "https://docs.npmjs.com/", 113 URL: "https://github.com/npm/cli", 114 Description: "a package manager for JavaScript", 115 }, 116 }, 117 }, 118 { 119 Fixture: "test-fixtures/pkg-json/package-nested-author.json", 120 ExpectedPkg: pkg.Package{ 121 Name: "npm", 122 Version: "6.14.6", 123 PURL: "pkg:npm/npm@6.14.6", 124 Type: pkg.NpmPkg, 125 Licenses: pkg.NewLicenseSet( 126 pkg.NewLicenseFromLocations("Artistic-2.0", file.NewLocation("test-fixtures/pkg-json/package-nested-author.json")), 127 ), 128 Language: pkg.JavaScript, 129 Metadata: pkg.NpmPackage{ 130 Name: "npm", 131 Version: "6.14.6", 132 Author: "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", 133 Homepage: "https://docs.npmjs.com/", 134 URL: "https://github.com/npm/cli", 135 Description: "a package manager for JavaScript", 136 }, 137 }, 138 }, 139 { 140 Fixture: "test-fixtures/pkg-json/package-repo-string.json", 141 ExpectedPkg: pkg.Package{ 142 Name: "function-bind", 143 Version: "1.1.1", 144 PURL: "pkg:npm/function-bind@1.1.1", 145 Type: pkg.NpmPkg, 146 Licenses: pkg.NewLicenseSet( 147 pkg.NewLicenseFromLocations("MIT", file.NewLocation("test-fixtures/pkg-json/package-repo-string.json")), 148 ), 149 Language: pkg.JavaScript, 150 Metadata: pkg.NpmPackage{ 151 Name: "function-bind", 152 Version: "1.1.1", 153 Author: "Raynos <raynos2@gmail.com>", 154 Homepage: "https://github.com/Raynos/function-bind", 155 URL: "git://github.com/Raynos/function-bind.git", 156 Description: "Implementation of Function.prototype.bind", 157 }, 158 }, 159 }, 160 { 161 Fixture: "test-fixtures/pkg-json/package-private.json", 162 ExpectedPkg: pkg.Package{ 163 Name: "npm", 164 Version: "6.14.6", 165 PURL: "pkg:npm/npm@6.14.6", 166 Type: pkg.NpmPkg, 167 Licenses: pkg.NewLicenseSet( 168 pkg.NewLicenseFromLocations("Artistic-2.0", file.NewLocation("test-fixtures/pkg-json/package-private.json")), 169 ), 170 Language: pkg.JavaScript, 171 Metadata: pkg.NpmPackage{ 172 Name: "npm", 173 Version: "6.14.6", 174 Author: "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)", 175 Homepage: "https://docs.npmjs.com/", 176 URL: "https://github.com/npm/cli", 177 Private: true, 178 Description: "a package manager for JavaScript", 179 }, 180 }, 181 }, 182 } 183 184 for _, test := range tests { 185 t.Run(test.Fixture, func(t *testing.T) { 186 test.ExpectedPkg.Locations.Add(file.NewLocation(test.Fixture)) 187 pkgtest.TestFileParser(t, test.Fixture, parsePackageJSON, []pkg.Package{test.ExpectedPkg}, nil) 188 }) 189 } 190 } 191 192 func TestParsePackageJSON_Partial(t *testing.T) { // see https://github.com/anchore/syft/issues/311 193 const fixtureFile = "test-fixtures/pkg-json/package-partial.json" 194 195 pkgtest.TestFileParser(t, fixtureFile, parsePackageJSON, nil, nil) 196 } 197 198 func Test_pathContainsNodeModulesDirectory(t *testing.T) { 199 tests := []struct { 200 path string 201 expected bool 202 }{ 203 // positive 204 { 205 path: "something/node_modules/package", 206 expected: true, 207 }, 208 { 209 path: "node_modules/package", 210 expected: true, 211 }, 212 { 213 path: "something/node_modules", 214 expected: true, 215 }, 216 { 217 path: "\\something\\node_modules\\", 218 expected: true, 219 }, 220 { 221 path: "\\something\\node_modules", 222 expected: true, 223 }, 224 // negative 225 { 226 path: "something/node_bogus_modules", 227 expected: false, 228 }, 229 { 230 path: "something/node_modules_bogus", 231 expected: false, 232 }, 233 { 234 path: "something/node_bogus_modules/package", 235 expected: false, 236 }, 237 } 238 for _, test := range tests { 239 t.Run(test.path, func(t *testing.T) { 240 assert.Equal(t, test.expected, pathContainsNodeModulesDirectory(test.path)) 241 }) 242 } 243 }