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  }