@@ -25,7 +25,7 @@ def app(self):
2525
2626 def setUp (self ):
2727 assert (
28- self .migrate_from and self .migrate_to
28+ self .migrate_from and self .migrate_to
2929 ), "TestCase '{}' must define migrate_from and migrate_to properties" .format (
3030 type (self ).__name__
3131 )
@@ -51,7 +51,6 @@ def setUpBeforeMigration(self, apps):
5151
5252
5353class DuplicateSeverityTestCase (TestMigrations ):
54-
5554 migrate_from = "0013_auto_20220503_0941"
5655 migrate_to = "0014_remove_duplicate_severities"
5756
@@ -60,7 +59,7 @@ def setUpBeforeMigration(self, apps):
6059 VulnerabilityReference = apps .get_model ("vulnerabilities" , "VulnerabilityReference" )
6160 Severities = apps .get_model ("vulnerabilities" , "VulnerabilitySeverity" )
6261 Vulnerability = apps .get_model ("vulnerabilities" , "Vulnerability" )
63-
62+
6463 reference = VulnerabilityReference .objects .create (
6564 reference_id = "CVE-TEST" , url = "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-TEST"
6665 )
@@ -96,7 +95,6 @@ def test_remove_duplicate_rows(self):
9695
9796
9897class DropVulnerabilityFromSeverityTestCase (TestMigrations ):
99-
10098 migrate_from = "0014_remove_duplicate_severities"
10199 migrate_to = "0015_alter_vulnerabilityseverity_unique_together_and_more"
102100
@@ -116,7 +114,6 @@ def test_dropping_vulnerability_from_severity(self):
116114
117115
118116class UpdateCPEURL (TestMigrations ):
119-
120117 migrate_from = "0015_alter_vulnerabilityseverity_unique_together_and_more"
121118 migrate_to = "0016_update_cpe_url"
122119
@@ -133,5 +130,177 @@ def setUpBeforeMigration(self, apps):
133130 def test_cpe_url_update (self ):
134131 # using get_model to avoid circular import
135132 VulnerabilityReference = self .apps .get_model ("vulnerabilities" , "VulnerabilityReference" )
136- ref = VulnerabilityReference .objects .get (reference_id = self .reference .reference_id )
133+ ref = VulnerabilityReference .objects .get (reference_id = self .reference .reference_id )
137134 assert ref .url == "https://nvd.nist.gov/vuln/search/results?adv_search=true&isCpeNameSearch=true&query=cpe:2.3:a:f5:nginx:*:*:*:*:*:*:*:*"
135+
136+
137+ class TestScoringElement (TestMigrations ):
138+ migrate_from = "0028_vulnerabilityseverity_scoring_elements"
139+ migrate_to = "0029_vulnerabilityserverity_compute_score"
140+
141+ def setUpBeforeMigration (self , apps ):
142+ # using get_model to avoid circular import
143+ VulnerabilitySeverity = apps .get_model ("vulnerabilities" , "VulnerabilitySeverity" )
144+ VulnerabilityReference = apps .get_model ("vulnerabilities" , "VulnerabilityReference" )
145+ reference = VulnerabilityReference .objects .create (id = 1 ,
146+ reference_id = "fake-reference_id" ,
147+ url = "fake-url" )
148+ reference .save ()
149+ self .reference = reference
150+ self .severity_list = [
151+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV2_VECTOR .identifier ,
152+ value = "AV:N/AC:L/Au:N/C:P/I:P/A:P" ,
153+ reference_id = 1 ),
154+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV3_VECTOR .identifier ,
155+ value = "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" ,
156+ reference_id = 1 ),
157+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV31_VECTOR .identifier ,
158+ value = "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" ,
159+ reference_id = 1 ),
160+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV2_VECTOR .identifier ,
161+ value = "" ,
162+ reference_id = 1 ),
163+ VulnerabilitySeverity .objects .create (scoring_system = "generic_textual" ,
164+ value = "Low" ,
165+ reference_id = 1 ),
166+ VulnerabilitySeverity .objects .create (scoring_system = "rhbs" , value = "medium" ,
167+ reference_id = 1 )
168+ ]
169+ for severity in self .severity_list :
170+ severity .save ()
171+
172+ def test_cvss_calculations (self ):
173+ # using get_model to avoid circular import
174+ VulnerabilitySeverity = self .apps .get_model ("vulnerabilities" , "VulnerabilitySeverity" )
175+ severity = VulnerabilitySeverity .objects .filter (reference_id = 1 ).order_by ('-scoring_system' )
176+ self .assertEqual ([severity [i ].scoring_elements for i in range (0 , 6 )], [None , None , '7.5' , '9.8' , '7.5' , None ])
177+
178+
179+ class TestRemoveExtraRows (TestMigrations ):
180+ migrate_from = "0029_vulnerabilityserverity_compute_score"
181+ migrate_to = "0030_vulnerabilityseverity_rm_extra_records_swap"
182+
183+ def setUpBeforeMigration (self , apps ):
184+ # using get_model to avoid circular import
185+ VulnerabilitySeverity = apps .get_model ("vulnerabilities" , "VulnerabilitySeverity" )
186+ VulnerabilityReference = apps .get_model ("vulnerabilities" , "VulnerabilityReference" )
187+ self .reference_list = [
188+ VulnerabilityReference .objects .create (id = 1 ,
189+ reference_id = "fake-reference_id1" ,
190+ url = "fake-url1" ),
191+
192+ VulnerabilityReference .objects .create (id = 2 ,
193+ reference_id = "fake-reference_id2" ,
194+ url = "fake-url2" ),
195+
196+ VulnerabilityReference .objects .create (id = 3 ,
197+ reference_id = "fake-reference_id3" ,
198+ url = "fake-url3" ),
199+
200+ VulnerabilityReference .objects .create (id = 4 ,
201+ reference_id = "fake-reference_id4" ,
202+ url = "fake-url4" )
203+ ]
204+
205+ for reference in self .reference_list :
206+ reference .save ()
207+
208+ self .severity_list = [
209+ # test severity_cvss2
210+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV2 .identifier ,
211+ value = "7.5" ,
212+ reference_id = 1 ),
213+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV2_VECTOR .identifier ,
214+ value = "AV:N/AC:L/Au:N/C:P/I:P/A:P" ,
215+ scoring_elements = "7.5" ,
216+ reference_id = 1 ),
217+ # test severity_cvss3
218+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV3 .identifier ,
219+ value = "7.5" ,
220+ reference_id = 2 ),
221+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV3_VECTOR .identifier ,
222+ value = "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" ,
223+ scoring_elements = "7.5" ,
224+ reference_id = 2 ),
225+ # test severity_cvss3_1
226+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV31 .identifier ,
227+ value = "9.8" ,
228+ reference_id = 3 ),
229+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV31_VECTOR .identifier ,
230+ value = "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" ,
231+ scoring_elements = "9.8" ,
232+ reference_id = 3 ),
233+ # test all type of severities for the same reference_id 4
234+
235+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV2 .identifier ,
236+ value = "7.5" ,
237+ reference_id = 4 ),
238+
239+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV2_VECTOR .identifier ,
240+ value = "AV:N/AC:L/Au:N/C:P/I:P/A:P" ,
241+ scoring_elements = "7.5" ,
242+ reference_id = 4 ),
243+
244+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV3 .identifier ,
245+ value = "7.5" ,
246+ reference_id = 4 ),
247+
248+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV3_VECTOR .identifier ,
249+ value = "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" ,
250+ scoring_elements = "7.5" ,
251+ reference_id = 4 ),
252+
253+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV31 .identifier ,
254+ value = "9.8" ,
255+ reference_id = 4 ),
256+
257+ VulnerabilitySeverity .objects .create (scoring_system = severity_systems .CVSSV3_VECTOR .identifier ,
258+ value = "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" ,
259+ scoring_elements = "9.8" ,
260+ reference_id = 4 ),
261+
262+ VulnerabilitySeverity .objects .create (scoring_system = "generic_textual" ,
263+ value = "Low" ,
264+ reference_id = 4 ),
265+
266+ VulnerabilitySeverity .objects .create (scoring_system = "rhbs" ,
267+ value = "medium" ,
268+ reference_id = 4 )
269+ ]
270+
271+ for severity in self .severity_list :
272+ severity .save ()
273+
274+ def test_rm_extra_records_and_swap (self ):
275+ # using get_model to avoid circular import
276+ VulnerabilitySeverity = self .apps .get_model ("vulnerabilities" , "VulnerabilitySeverity" )
277+ severity_cvss2 = VulnerabilitySeverity .objects .get (reference_id = 1 )
278+ self .assertEqual (severity_cvss2 .value , "AV:N/AC:L/Au:N/C:P/I:P/A:P" )
279+ self .assertEqual (severity_cvss2 .scoring_elements , "7.5" )
280+
281+ severity_cvss3 = VulnerabilitySeverity .objects .get (reference_id = 2 )
282+ self .assertEqual (severity_cvss3 .value , "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" )
283+ self .assertEqual (severity_cvss3 .scoring_elements , "7.5" )
284+
285+ severity_cvss3_1 = VulnerabilitySeverity .objects .get (reference_id = 3 )
286+ self .assertEqual (severity_cvss3_1 .value , "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" )
287+ self .assertEqual (severity_cvss3_1 .scoring_elements , "9.8" )
288+
289+ severities = VulnerabilitySeverity .objects .filter (reference_id = 4 )
290+ assert len (severities ) == 5
291+ self .assertEqual (severities [0 ].value , "AV:N/AC:L/Au:N/C:P/I:P/A:P" )
292+ self .assertEqual (severities [0 ].scoring_elements , "7.5" )
293+
294+ self .assertEqual (severities [1 ].value , "CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H" )
295+ self .assertEqual (severities [1 ].scoring_elements , "7.5" )
296+
297+ self .assertEqual (severities [2 ].value , "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H" )
298+ self .assertEqual (severities [2 ].scoring_elements , "9.8" )
299+
300+ self .assertEqual (severities [3 ].value , "Low" )
301+ self .assertIsNone (severities [3 ].scoring_elements )
302+
303+ self .assertEqual (severities [4 ].value , 'medium' )
304+ self .assertIsNone (severities [4 ].scoring_elements )
305+
306+
0 commit comments