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  }