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