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