Skip to content

Commit ad3ff5a

Browse files
committed
Tests for and using example importer improver
Following are tests associated with example importer and improver to make sure the importer improver framework is working properly. Signed-off-by: Hritik Vijay <hritikxx8@gmail.com>
1 parent 2a9a594 commit ad3ff5a

1 file changed

Lines changed: 118 additions & 0 deletions

File tree

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
import datetime
2+
import os
3+
from unittest.mock import patch
4+
5+
from django.test import TestCase
6+
from packageurl import PackageURL
7+
from univers.version_constraint import VersionConstraint
8+
from univers.version_range import NginxVersionRange
9+
from univers.versions import SemverVersion
10+
11+
from vulnerabilities import models
12+
from vulnerabilities.import_runner import ImportRunner
13+
from vulnerabilities.importer import AdvisoryData
14+
from vulnerabilities.importer import AffectedPackage
15+
from vulnerabilities.importer import Reference
16+
from vulnerabilities.importer import ScoringSystem
17+
from vulnerabilities.importer import VulnerabilitySeverity
18+
from vulnerabilities.importers.example import ExampleAliasImprover
19+
from vulnerabilities.importers.example import ExampleImporter
20+
from vulnerabilities.importers.example import parse_advisory_data
21+
from vulnerabilities.improve_runner import ImproveRunner
22+
from vulnerabilities.improvers.default import DefaultImprover
23+
24+
25+
def mock_fetch_advisory_data():
26+
return [
27+
{
28+
"id": "CVE-2021-12341337",
29+
"summary": "Dummy advisory",
30+
"advisory_severity": "high",
31+
"vulnerable": "0.6.18-1.20.0",
32+
"fixed": "1.20.1",
33+
"reference": "http://example.com/cve-2021-1234",
34+
"published_on": "06-10-2021 UTC",
35+
}
36+
]
37+
38+
39+
def mock_fetch_additional_aliases(alias):
40+
alias_map = {
41+
"CVE-2021-12341337": ["ANONSEC-1337", "CERTDES-1337"],
42+
}
43+
return alias_map.get(alias)
44+
45+
46+
@patch("vulnerabilities.importers.example.fetch_advisory_data", mock_fetch_advisory_data)
47+
@patch("vulnerabilities.importers.example.fetch_additional_aliases", mock_fetch_additional_aliases)
48+
class TestExampleImporter(TestCase):
49+
def test_parse_advisory_data(self):
50+
raw_data = mock_fetch_advisory_data()[0]
51+
expected = AdvisoryData(
52+
aliases=["CVE-2021-12341337"],
53+
summary="Dummy advisory",
54+
affected_packages=[
55+
AffectedPackage(
56+
package=PackageURL(
57+
type="example",
58+
namespace=None,
59+
name="dummy_package",
60+
version=None,
61+
qualifiers={},
62+
subpath=None,
63+
),
64+
affected_version_range=NginxVersionRange(
65+
constraints=(
66+
VersionConstraint(
67+
comparator=">=", version=SemverVersion(string="0.6.18")
68+
),
69+
VersionConstraint(
70+
comparator="<=", version=SemverVersion(string="1.20.0")
71+
),
72+
)
73+
),
74+
fixed_version=SemverVersion(string="1.20.1"),
75+
)
76+
],
77+
references=[
78+
Reference(
79+
reference_id="",
80+
url="http://example.com/cve-2021-1234",
81+
severities=[
82+
VulnerabilitySeverity(
83+
system=ScoringSystem(
84+
identifier="generic_textual",
85+
name="Generic textual severity rating",
86+
url="",
87+
notes="Severity for unknown scoring systems. Contains generic textual values like High, Low etc",
88+
),
89+
value="high",
90+
)
91+
],
92+
)
93+
],
94+
date_published=datetime.datetime(2021, 10, 6, 0, 0, tzinfo=datetime.timezone.utc),
95+
)
96+
actual = parse_advisory_data(raw_data)
97+
assert actual == expected
98+
99+
def test_import_framework_using_example_importer(self):
100+
raw_datas = mock_fetch_advisory_data()
101+
ImportRunner(ExampleImporter).run()
102+
103+
for raw_data in raw_datas:
104+
assert models.Advisory.objects.get(aliases__contains=raw_data["id"])
105+
106+
def test_improve_framework_using_example_improver(self):
107+
ImportRunner(ExampleImporter).run()
108+
ImproveRunner(DefaultImprover).run()
109+
ImproveRunner(ExampleAliasImprover).run()
110+
raw_datas = mock_fetch_advisory_data()
111+
112+
assert models.Package.objects.count() == 3
113+
assert models.PackageRelatedVulnerability.objects.filter(fix=True).count() == 1
114+
assert models.PackageRelatedVulnerability.objects.filter(fix=False).count() == 2
115+
assert models.VulnerabilitySeverity.objects.count() == 1
116+
assert models.VulnerabilityReference.objects.count() == 1
117+
for raw_data in raw_datas:
118+
assert models.Vulnerability.objects.get(summary=raw_data["summary"])

0 commit comments

Comments
 (0)