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  }