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  }