github.com/joey-fossa/fossa-cli@v0.7.34-0.20190708193710-569f1e8679f0/buildtools/pipenv/pipenv_test.go (about) 1 package pipenv_test 2 3 import ( 4 "errors" 5 "io/ioutil" 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 10 "github.com/fossas/fossa-cli/buildtools/pipenv" 11 "github.com/fossas/fossa-cli/pkg" 12 ) 13 14 /* 15 ├── a@1.0.0 16 └─┬ b@2.0.0 17 ├─┬ c@3.0.0 18 │ └── d@4.0.0 19 └── e@5.0.0 20 */ 21 func TestDirectDeps(t *testing.T) { 22 file, err := ioutil.ReadFile("testdata/get-deps/pipenv-graph-json-tree.json") 23 assert.NoError(t, err) 24 testEnv := Mock(file, nil) 25 26 deps, error := testEnv.Deps() 27 assert.NoError(t, error) 28 29 imports := deps.Direct 30 assert.NotZero(t, imports) 31 assert.Equal(t, 2, len(imports)) 32 assertImport(t, imports, "a", "1.0.0") 33 assertImport(t, imports, "b", "2.0.0") 34 } 35 36 func TestTransitiveDeps(t *testing.T) { 37 file, err := ioutil.ReadFile("testdata/get-deps/pipenv-graph-json-tree.json") 38 assert.NoError(t, err) 39 testEnv := Mock(file, nil) 40 41 deps, error := testEnv.Deps() 42 assert.NoError(t, error) 43 44 graph := deps.Transitive 45 assert.NotZero(t, graph) 46 47 packageA := findPackage(graph, "a", "1.0.0") 48 assert.NotZero(t, packageA) 49 assert.Equal(t, 1, len(packageA.Imports)) 50 assertImport(t, packageA.Imports, "e", "5.0.0") 51 52 packageB := findPackage(graph, "b", "2.0.0") 53 assert.NotZero(t, packageB) 54 assert.Equal(t, 2, len(packageB.Imports)) 55 assertImport(t, packageB.Imports, "c", "3.0.0") 56 assertImport(t, packageB.Imports, "e", "5.0.0") 57 58 packageC := findPackage(graph, "c", "3.0.0") 59 assert.NotZero(t, packageC) 60 assert.Equal(t, 1, len(packageC.Imports)) 61 assertImport(t, packageC.Imports, "d", "4.0.0") 62 63 packageD := findPackage(graph, "d", "4.0.0") 64 assert.NotZero(t, packageD) 65 assert.Equal(t, 0, len(packageD.Imports)) 66 67 packageE := findPackage(graph, "e", "5.0.0") 68 assert.NotZero(t, packageE) 69 assert.Equal(t, 0, len(packageE.Imports)) 70 } 71 72 func TestNoFile(t *testing.T) { 73 testEnv := Mock([]byte{}, errors.New("test error")) 74 75 deps, err := testEnv.Deps() 76 assert.Zero(t, deps) 77 assert.EqualError(t, err, "test error") 78 } 79 80 // Mock constructs a pipenv.Cmd using mock build tool output. 81 func Mock(file []byte, err error) pipenv.Cmd { 82 return pipenv.Cmd{ 83 Graph: func(string) (string, error) { 84 return string(file), err 85 }, 86 } 87 } 88 89 func findPackage(packages map[pkg.ID]pkg.Package, name, revision string) pkg.Package { 90 for id := range packages { 91 if id.Name == name && id.Revision == revision { 92 return packages[id] 93 } 94 } 95 return pkg.Package{} 96 } 97 98 func assertImport(t *testing.T, imports pkg.Imports, name, revision string) { 99 for _, importedProj := range imports { 100 if importedProj.Resolved.Name == name { 101 if importedProj.Resolved.Revision == revision { 102 return 103 } 104 assert.Fail(t, "found "+name+"@"+importedProj.Resolved.Revision+" instead of "+revision) 105 } 106 } 107 assert.Fail(t, "missing "+name+"@"+revision) 108 }