1818
1919from unittest import TestCase
2020
21- from cyclonedx .contrib .bom .utils import BomRefDiscriminator
21+ from cyclonedx .contrib .bom .utils import BomDependencyGraphFlatMerger , BomRefDiscriminator
22+ from cyclonedx .model .bom import Bom
2223from cyclonedx .model .bom_ref import BomRef
24+ from cyclonedx .model .dependency import Dependency
2325
2426
2527class TestBomRefDiscriminator (TestCase ):
@@ -46,3 +48,143 @@ def test_discriminate_and_reset_with(self) -> None:
4648 self .assertNotEqual (bomref1 .value , bomref2 .value , 'should be discriminated' )
4749 self .assertEqual ('djdlkfjdslkf' , bomref1 .value )
4850 self .assertEqual ('djdlkfjdslkf' , bomref2 .value )
51+
52+
53+ class TestBomDependencyGraphFlatMerger (TestCase ):
54+
55+ def test_flatten_merge_and_reset_manually (self ) -> None :
56+ root_bom_ref = BomRef ('root_bom_ref' )
57+ component1_bom_ref = BomRef ('component1_bom_ref' )
58+ component2_bom_ref = BomRef ('component2_bom_ref' )
59+ component3_bom_ref = BomRef ('component3_bom_ref' )
60+ component4_bom_ref = BomRef ('component4_bom_ref' )
61+ component5_bom_ref = BomRef ('component5_bom_ref' )
62+ bom = Bom (dependencies = [
63+ Dependency (
64+ root_bom_ref ,
65+ dependencies = [
66+ component1_bom_dep := Dependency (
67+ component1_bom_ref ,
68+ dependencies = [
69+ component2_bom_dep := Dependency (
70+ component2_bom_ref ,
71+ dependencies = [
72+ component3_bom_dep := Dependency (component3_bom_ref ),
73+ ]
74+ ),
75+ ]
76+ ),
77+ component2_bom_dep2 := Dependency (
78+ component2_bom_ref ,
79+ dependencies = [
80+ component4_bom_dep := Dependency (component4_bom_ref ),
81+ ]
82+ ),
83+ ]
84+ ),
85+ component3_bom_dep2 := Dependency (
86+ component3_bom_ref ,
87+ dependencies = [
88+ component4_bom_dep2 := Dependency (component4_bom_ref ),
89+ ]
90+ ),
91+ Dependency (component5_bom_ref , (
92+ component1_bom_dep ,
93+ component2_bom_dep ,
94+ component2_bom_dep2 ,
95+ component3_bom_dep ,
96+ component3_bom_dep2 ,
97+ component4_bom_dep ,
98+ component4_bom_dep2 ,
99+ Dependency (root_bom_ref )
100+ ))
101+ ])
102+ bom_dependencies = bom .dependencies
103+ merger = BomDependencyGraphFlatMerger (bom )
104+ merger .flatten_merge ()
105+ self .assertEqual (6 , len (bom .dependencies ), 'not expected len()' )
106+ self .assertSetEqual ({
107+ Dependency (root_bom_ref , (Dependency (component1_bom_ref ), Dependency (component2_bom_ref ))),
108+ Dependency (component1_bom_ref , (Dependency (component2_bom_ref ), )),
109+ Dependency (component2_bom_ref , (Dependency (component3_bom_ref ), Dependency (component4_bom_ref ), )),
110+ Dependency (component3_bom_ref , (Dependency (component4_bom_ref ), )),
111+ Dependency (component4_bom_ref ),
112+ Dependency (component5_bom_ref , (
113+ Dependency (root_bom_ref ),
114+ Dependency (component1_bom_ref ),
115+ Dependency (component2_bom_ref ),
116+ Dependency (component3_bom_ref ),
117+ Dependency (component4_bom_ref ),
118+ )),
119+ }, bom .dependencies )
120+ merger .reset ()
121+ self .assertIs (bom_dependencies , bom .dependencies )
122+ self .assertSetEqual (bom_dependencies , bom .dependencies )
123+
124+ def test_flatten_merge_and_reset_with (self ) -> None :
125+ root_bom_ref = BomRef ('root_bom_ref' )
126+ component1_bom_ref = BomRef ('component1_bom_ref' )
127+ component2_bom_ref = BomRef ('component2_bom_ref' )
128+ component3_bom_ref = BomRef ('component3_bom_ref' )
129+ component4_bom_ref = BomRef ('component4_bom_ref' )
130+ component5_bom_ref = BomRef ('component5_bom_ref' )
131+ bom = Bom (dependencies = [
132+ Dependency (
133+ root_bom_ref ,
134+ dependencies = [
135+ component1_bom_dep := Dependency (
136+ component1_bom_ref ,
137+ dependencies = [
138+ component2_bom_dep := Dependency (
139+ component2_bom_ref ,
140+ dependencies = [
141+ component3_bom_dep := Dependency (component3_bom_ref ),
142+ ]
143+ ),
144+ ]
145+ ),
146+ component2_bom_dep2 := Dependency (
147+ component2_bom_ref ,
148+ dependencies = [
149+ component4_bom_dep := Dependency (component4_bom_ref ),
150+ ]
151+ ),
152+ ]
153+ ),
154+ component3_bom_dep2 := Dependency (
155+ component3_bom_ref ,
156+ dependencies = [
157+ component4_bom_dep2 := Dependency (component4_bom_ref ),
158+ ]
159+ ),
160+ Dependency (component5_bom_ref , (
161+ Dependency (root_bom_ref ),
162+ component1_bom_dep ,
163+ component2_bom_dep ,
164+ component2_bom_dep2 ,
165+ component3_bom_dep ,
166+ component3_bom_dep2 ,
167+ component4_bom_dep ,
168+ component4_bom_dep2 ,
169+ ))
170+ ])
171+ bom_dependencies = bom .dependencies
172+ merger = BomDependencyGraphFlatMerger (bom )
173+ with merger :
174+ self .assertEqual (6 , len (bom .dependencies ), 'not expected len()' )
175+ self .assertSetEqual ({
176+ Dependency (root_bom_ref , (Dependency (component1_bom_ref ), Dependency (component2_bom_ref ))),
177+ Dependency (component1_bom_ref , (Dependency (component2_bom_ref ), )),
178+ Dependency (component2_bom_ref , (Dependency (component3_bom_ref ), Dependency (component4_bom_ref ), )),
179+ Dependency (component3_bom_ref , (Dependency (component4_bom_ref ), )),
180+ Dependency (component4_bom_ref ),
181+ Dependency (component5_bom_ref , (
182+ Dependency (root_bom_ref ),
183+ Dependency (component1_bom_ref ),
184+ Dependency (component2_bom_ref ),
185+ Dependency (component3_bom_ref ),
186+ Dependency (component4_bom_ref ),
187+ )),
188+ }, bom .dependencies )
189+ self .assertIs (bom_dependencies , bom .dependencies )
190+ self .assertSetEqual (bom_dependencies , bom .dependencies )
0 commit comments