Skip to content

Commit ea16ce4

Browse files
committed
add a migration test
Signed-off-by: ziadhany <ziadhany2016@gmail.com> rename migration variable model Signed-off-by: ziadhany <ziadhany2016@gmail.com>
1 parent 6cd4c28 commit ea16ce4

2 files changed

Lines changed: 181 additions & 12 deletions

File tree

vulnerabilities/migrations/0030_vulnerabilityseverity _rm_extra_records_swap.py renamed to vulnerabilities/migrations/0030_vulnerabilityseverity_rm_extra_records_swap.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33

44
def remove_extra_rows(apps, schema_editor):
5-
Vuln_severity = apps.get_model('vulnerabilities', 'VulnerabilitySeverity')
5+
VulnerabilitySeverity = apps.get_model('vulnerabilities', 'VulnerabilitySeverity')
66
duplicates = (
7-
Vuln_severity.objects
7+
VulnerabilitySeverity.objects
88
.filter(scoring_system__in=["cvssv2_vector", "cvssv3_vector", "cvssv3.1_vector"])
99
)
1010

1111
for duplicate in duplicates:
1212
(
13-
Vuln_severity.objects
13+
VulnerabilitySeverity.objects
1414
.filter(reference_id=duplicate.reference_id,
1515
scoring_system__in=["cvssv2", "cvssv3", "cvssv3.1"],
1616
value=duplicate.scoring_elements)
@@ -19,14 +19,14 @@ def remove_extra_rows(apps, schema_editor):
1919

2020

2121
def swap_scoring_elements_with_value(apps, schema_editor):
22-
Vuln_severity = apps.get_model('vulnerabilities', 'VulnerabilitySeverity')
23-
for vuln_severity in Vuln_severity.objects.all():
22+
VulnerabilitySeverity = apps.get_model('vulnerabilities', 'VulnerabilitySeverity')
23+
for vuln_severity in VulnerabilitySeverity.objects.all():
2424
cvss_mapper = {
2525
"cvssv2_vector": "cvssv2",
2626
"cvssv3_vector": "cvssv3",
2727
"cvssv3.1_vector": "cvssv3.1",
2828
}
29-
if vuln_severity.scoring_system in ["cvssv2_vector", "cvssv3_vector", "cvssv3.1_vector"]:
29+
if VulnerabilitySeverity.scoring_system in ["cvssv2_vector", "cvssv3_vector", "cvssv3.1_vector"]:
3030
vuln_severity.scoring_system = cvss_mapper[vuln_severity.scoring_system]
3131
temp = vuln_severity.scoring_elements # value
3232
vuln_severity.scoring_elements = vuln_severity.value

vulnerabilities/tests/test_data_migrations.py

Lines changed: 175 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5353
class 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

9897
class 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

118116
class 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

Comments
 (0)