102 lines
2.4 KiB
Go
102 lines
2.4 KiB
Go
// ©AngelaMos | 2026
|
|
// graph_test.go
|
|
|
|
package graph
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/CarterPerez-dev/bomber/pkg/types"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func makeTestGraph() *types.DependencyGraph {
|
|
root := types.Package{Name: "root", PURL: "pkg:test/root@1.0.0"}
|
|
g := types.NewDependencyGraph(root)
|
|
|
|
a := types.Package{Name: "a", PURL: "pkg:test/a@1.0.0", Direct: true, DepthLevel: 1}
|
|
b := types.Package{Name: "b", PURL: "pkg:test/b@1.0.0", Direct: true, DepthLevel: 1}
|
|
c := types.Package{Name: "c", PURL: "pkg:test/c@1.0.0", Direct: false, DepthLevel: 2}
|
|
|
|
g.AddPackage(a)
|
|
g.AddPackage(b)
|
|
g.AddPackage(c)
|
|
g.AddEdge(root.PURL, a.PURL)
|
|
g.AddEdge(root.PURL, b.PURL)
|
|
g.AddEdge(a.PURL, c.PURL)
|
|
g.AddEdge(b.PURL, c.PURL)
|
|
|
|
return g
|
|
}
|
|
|
|
func TestAllPackages(t *testing.T) {
|
|
g := makeTestGraph()
|
|
pkgs := AllPackages(g)
|
|
assert.Len(t, pkgs, 4)
|
|
}
|
|
|
|
func TestDirectPackages(t *testing.T) {
|
|
g := makeTestGraph()
|
|
pkgs := DirectPackages(g)
|
|
assert.Len(t, pkgs, 2)
|
|
}
|
|
|
|
func TestTransitivePackages(t *testing.T) {
|
|
g := makeTestGraph()
|
|
pkgs := TransitivePackages(g)
|
|
assert.Len(t, pkgs, 1)
|
|
}
|
|
|
|
func TestMaxDepth(t *testing.T) {
|
|
g := makeTestGraph()
|
|
assert.Equal(t, 2, MaxDepth(g))
|
|
}
|
|
|
|
func TestDetectCyclesNone(t *testing.T) {
|
|
g := makeTestGraph()
|
|
cycles := DetectCycles(g)
|
|
assert.Empty(t, cycles)
|
|
}
|
|
|
|
func TestDetectCyclesFound(t *testing.T) {
|
|
root := types.Package{Name: "root", PURL: "pkg:test/root@1.0.0"}
|
|
g := types.NewDependencyGraph(root)
|
|
|
|
a := types.Package{Name: "a", PURL: "pkg:test/a@1.0.0"}
|
|
b := types.Package{Name: "b", PURL: "pkg:test/b@1.0.0"}
|
|
|
|
g.AddPackage(a)
|
|
g.AddPackage(b)
|
|
g.AddEdge(root.PURL, a.PURL)
|
|
g.AddEdge(a.PURL, b.PURL)
|
|
g.AddEdge(b.PURL, a.PURL)
|
|
|
|
cycles := DetectCycles(g)
|
|
require.NotEmpty(t, cycles)
|
|
}
|
|
|
|
func TestMergeGraphs(t *testing.T) {
|
|
g1 := makeTestGraph()
|
|
|
|
root2 := types.Package{Name: "root2", PURL: "pkg:test/root2@1.0.0"}
|
|
g2 := types.NewDependencyGraph(root2)
|
|
d := types.Package{Name: "d", PURL: "pkg:test/d@1.0.0"}
|
|
g2.AddPackage(d)
|
|
g2.AddEdge(root2.PURL, d.PURL)
|
|
|
|
merged := MergeGraphs([]*types.DependencyGraph{g1, g2})
|
|
assert.Len(t, AllPackages(merged), 7)
|
|
}
|
|
|
|
func TestMergeGraphsEmpty(t *testing.T) {
|
|
merged := MergeGraphs(nil)
|
|
assert.Equal(t, "merged", merged.Root.Name)
|
|
}
|
|
|
|
func TestMergeGraphsSingle(t *testing.T) {
|
|
g := makeTestGraph()
|
|
merged := MergeGraphs([]*types.DependencyGraph{g})
|
|
assert.Equal(t, g, merged)
|
|
}
|