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 }