github.com/joey-fossa/fossa-cli@v0.7.34-0.20190708193710-569f1e8679f0/buildtools/npm/manifest_test.go (about)

     1  package npm_test
     2  
     3  import (
     4  	"path/filepath"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	"github.com/fossas/fossa-cli/buildtools/npm"
    10  	"github.com/fossas/fossa-cli/pkg"
    11  )
    12  
    13  var chaiDirectDep = pkg.Import{
    14  	Target: "chai",
    15  	Resolved: pkg.ID{
    16  		Location: "",
    17  		Name:     "chai",
    18  		Revision: "4.1.2",
    19  		Type:     pkg.NodeJS,
    20  	},
    21  }
    22  
    23  var typeDetectDirectDep = pkg.Import{
    24  	Target: "type-detect",
    25  	Resolved: pkg.ID{
    26  		Location: "",
    27  		Name:     "type-detect",
    28  		Revision: "3.0.0",
    29  		Type:     pkg.NodeJS,
    30  	},
    31  }
    32  
    33  func TestFromManifest(t *testing.T) {
    34  	pkg, err := npm.PackageFromManifest(filepath.Join("testdata", "nested_node_modules"), "package.json")
    35  	assert.NoError(t, err)
    36  
    37  	assert.Len(t, pkg.Imports, 2)
    38  	assert.Contains(t, pkg.Imports, chaiDirectDep)
    39  	assert.Contains(t, pkg.Imports, typeDetectDirectDep)
    40  }
    41  
    42  func TestFromNodeModules(t *testing.T) {
    43  	testFromNodeModulesByFixture(t, "flattened_node_modules")
    44  	testFromNodeModulesByFixture(t, "nested_node_modules")
    45  }
    46  
    47  /*
    48  	├─┬ chai@4.1.2
    49  	│ ├── assertion-error@1.1.0
    50  	│ ├── check-error@1.0.2
    51  	│ ├─┬ deep-eql@3.0.1
    52  	│ │ └── type-detect@4.0.8
    53  	│ ├── get-func-name@2.0.0
    54  	│ ├── pathval@1.1.0
    55  	│ └── type-detect@4.0.8
    56  	└── type-detect@3.0.0
    57  */
    58  
    59  func testFromNodeModulesByFixture(t *testing.T, fixture string) {
    60  	depGraph, err := npm.FromNodeModules("testdata", fixture, "package.json")
    61  	assert.NoError(t, err)
    62  
    63  	assert.Len(t, depGraph.Direct, 2)
    64  
    65  	assert.Contains(t, depGraph.Direct, chaiDirectDep)
    66  	assert.Contains(t, depGraph.Direct, typeDetectDirectDep)
    67  
    68  	assert.Len(t, depGraph.Transitive, 8)
    69  
    70  	typeDetectTransitiveDepKey := pkg.ID{
    71  		Location: "",
    72  		Name:     "type-detect",
    73  		Revision: "4.0.8",
    74  		Type:     pkg.NodeJS,
    75  	}
    76  
    77  	// ensure project that is both a transitive and direct dep have correct versions based on where they live
    78  	assert.Contains(t, depGraph.Transitive, typeDetectTransitiveDepKey)
    79  
    80  	chaiProject := depGraph.Transitive[chaiDirectDep.Resolved]
    81  	assert.Equal(t, chaiDirectDep.Resolved, chaiProject.ID)
    82  	assert.NotNil(t, chaiProject)
    83  	assert.Len(t, chaiProject.Imports, 6)
    84  	AssertImport(t, chaiProject.Imports, "assertion-error", "1.1.0")
    85  	AssertImport(t, chaiProject.Imports, "check-error", "1.0.2")
    86  	AssertImport(t, chaiProject.Imports, "get-func-name", "2.0.0")
    87  	AssertImport(t, chaiProject.Imports, "pathval", "1.1.0")
    88  	AssertImport(t, chaiProject.Imports, "type-detect", "4.0.8")
    89  
    90  	typeDetectProject := depGraph.Transitive[typeDetectDirectDep.Resolved]
    91  	assert.Equal(t, typeDetectDirectDep.Resolved, typeDetectProject.ID)
    92  	assert.Empty(t, typeDetectProject.Imports)
    93  }
    94  
    95  func AssertImport(t *testing.T, imports pkg.Imports, name, revision string) {
    96  	for _, importedProj := range imports {
    97  		if importedProj.Resolved.Name == name && importedProj.Resolved.Revision == revision {
    98  			return
    99  		}
   100  	}
   101  
   102  	assert.Fail(t, "missing "+name+"@"+revision)
   103  }