Skip to content

Commit adc86b5

Browse files
committed
Refactor tests
Signed-off-by: Shivam Sandbhor <shivam.sandbhor@gmail.com>
1 parent 742a40d commit adc86b5

5 files changed

Lines changed: 47 additions & 43 deletions

File tree

vulnerabilities/importers/elixir_security.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ def get_versions_for_pkg_from_range_list(self, version_range_list, pkg_name):
8787
all_version_list = self.pkg_manager_api.get(pkg_name)
8888
if not version_range_list:
8989
return [], all_version_list
90-
version_ranges = {
90+
version_ranges = [
9191
VersionSpecifier.from_scheme_version_spec_string("semver", r)
9292
for r in version_range_list
93-
}
93+
]
9494
for version in all_version_list:
9595
version_obj = SemverVersion(version)
9696
if any([version_obj in v for v in version_ranges]):

vulnerabilities/importers/rust.py

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
import asyncio
2424
import re
2525
from itertools import chain
26-
from typing import Optional, Mapping
26+
from typing import Optional
27+
from typing import Mapping
28+
from typing import List
2729
from typing import Set
2830
from typing import Tuple
2931
from urllib.error import HTTPError
@@ -104,22 +106,22 @@ def _load_advisory(self, path: str) -> Optional[Advisory]:
104106

105107
# FIXME: Avoid wildcard version ranges for now.
106108
# See https://github.com/RustSec/advisory-db/discussions/831
107-
affected_ranges = {
109+
affected_ranges = [
108110
VersionSpecifier.from_scheme_version_spec_string("semver", r)
109111
for r in chain.from_iterable(record.get("affected", {}).get("functions", {}).values())
110112
if r != "*"
111-
}
113+
]
112114

113-
unaffected_ranges = {
115+
unaffected_ranges = [
114116
VersionSpecifier.from_scheme_version_spec_string("semver", r)
115117
for r in record.get("versions", {}).get("unaffected", [])
116118
if r != "*"
117-
}
118-
resolved_ranges = {
119+
]
120+
resolved_ranges = [
119121
VersionSpecifier.from_scheme_version_spec_string("semver", r)
120122
for r in record.get("versions", {}).get("patched", [])
121123
if r != "*"
122-
}
124+
]
123125

124126
unaffected, affected = categorize_versions(
125127
all_versions, unaffected_ranges, affected_ranges, resolved_ranges
@@ -153,9 +155,9 @@ def _load_advisory(self, path: str) -> Optional[Advisory]:
153155

154156
def categorize_versions(
155157
all_versions: Set[str],
156-
unaffected_versions: Set[VersionSpecifier],
157-
affected_versions: Set[VersionSpecifier],
158-
resolved_versions: Set[VersionSpecifier],
158+
unaffected_version_ranges: List[VersionSpecifier],
159+
affected_version_ranges: List[VersionSpecifier],
160+
resolved_version_ranges: List[VersionSpecifier],
159161
) -> Tuple[Set[str], Set[str]]:
160162
"""
161163
Categorize all versions of a crate according to the given version ranges.
@@ -165,24 +167,30 @@ def categorize_versions(
165167

166168
unaffected, affected = set(), set()
167169

168-
if not any(unaffected_versions.union(affected_versions).union(resolved_versions)):
170+
if (
171+
not unaffected_version_ranges
172+
and not affected_version_ranges
173+
and not resolved_version_ranges
174+
):
169175
return unaffected, affected
170176

171177
# TODO: This is probably wrong
172178
for version in all_versions:
173179
version_obj = SemverVersion(version)
174-
if affected_versions and all([version_obj in av for av in affected_versions]):
180+
if affected_version_ranges and all([version_obj in av for av in affected_version_ranges]):
175181
affected.add(version)
176-
elif unaffected_versions and all([version_obj in av for av in unaffected_versions]):
182+
elif unaffected_version_ranges and all(
183+
[version_obj in av for av in unaffected_version_ranges]
184+
):
177185
unaffected.add(version)
178-
elif resolved_versions and all([version_obj in av for av in resolved_versions]):
186+
elif resolved_version_ranges and all([version_obj in av for av in resolved_version_ranges]):
179187
unaffected.add(version)
180188

181189
# If some versions were not classified above, one or more of the given ranges might be empty, so
182190
# the remaining versions default to either affected or unaffected.
183191
uncategorized_versions = all_versions - unaffected.union(affected)
184192
if uncategorized_versions:
185-
if not affected_versions:
193+
if not affected_version_ranges:
186194
affected.update(uncategorized_versions)
187195
else:
188196
unaffected.update(uncategorized_versions)

vulnerabilities/importers/safety_db.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,16 +167,19 @@ def categorize_versions(
167167
:return: impacted, resolved purls
168168
"""
169169
impacted_versions, impacted_purls = set(), set()
170-
vurl_spec = f"pypi:{ ','.join(version_specs) }"
171-
vurl_spec = VersionSpecifier.from_version_spec_string(vurl_spec)
170+
# vurl_spec = f"pypi:{ ','.join(version_specs) }"
171+
# vurl_spec = VersionSpecifier.from_version_spec_string(vurl_spec)
172+
vurl_specs = []
173+
for version_spec in version_specs:
174+
vurl_specs.append(VersionSpecifier.from_scheme_version_spec_string("pypi", version_spec))
172175

173176
for version in all_versions:
174177
try:
175178
version_object = PYPIVersion(version)
176179
except:
177180
continue
178181

179-
if version_object in vurl_spec:
182+
if any([version_object in vurl_spec for vurl_spec in vurl_specs]):
180183
impacted_versions.add(version)
181184
impacted_purls.add(
182185
PackageURL(

vulnerabilities/tests/test_rust.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@
5252
def test_categorize_versions():
5353
flatbuffers_versions = MOCKED_CRATES_API_VERSIONS["flatbuffers"]
5454

55-
unaffected_ranges = {VersionSpecifier.from_scheme_version_spec_string("semver", "< 0.4.0")}
56-
affected_ranges = {
55+
unaffected_ranges = [VersionSpecifier.from_scheme_version_spec_string("semver", "< 0.4.0")]
56+
affected_ranges = [
5757
VersionSpecifier.from_scheme_version_spec_string("semver", ">= 0.4.0"),
5858
VersionSpecifier.from_scheme_version_spec_string("semver", "<= 0.6.0"),
59-
}
60-
resolved_ranges = {VersionSpecifier.from_scheme_version_spec_string("semver", ">= 0.6.1")}
59+
]
60+
resolved_ranges = [VersionSpecifier.from_scheme_version_spec_string("semver", ">= 0.6.1")]
6161

6262
unaffected_versions, affected_versions = categorize_versions(
6363
set(flatbuffers_versions),
@@ -77,9 +77,9 @@ def test_categorize_versions():
7777
def test_categorize_versions_without_affected_ranges():
7878
all_versions = {"1.0", "1.1", "2.0", "2.1", "3.0", "3.1"}
7979

80-
unaffected_ranges = {VersionSpecifier.from_scheme_version_spec_string("semver", "< 1.2")}
81-
affected_ranges = set()
82-
resolved_ranges = {VersionSpecifier.from_scheme_version_spec_string("semver", ">= 3.0")}
80+
unaffected_ranges = [VersionSpecifier.from_scheme_version_spec_string("semver", "< 1.2")]
81+
affected_ranges = []
82+
resolved_ranges = [VersionSpecifier.from_scheme_version_spec_string("semver", ">= 3.0")]
8383

8484
unaffected_versions, affected_versions = categorize_versions(
8585
all_versions,
@@ -102,12 +102,12 @@ def test_categorize_versions_without_affected_ranges():
102102
def test_categorize_versions_with_only_affected_ranges():
103103
all_versions = {"1.0", "1.1", "2.0", "2.1", "3.0", "3.1"}
104104

105-
unaffected_ranges = set()
106-
affected_ranges = {
105+
unaffected_ranges = []
106+
affected_ranges = [
107107
VersionSpecifier.from_scheme_version_spec_string("semver", "> 1.2"),
108108
VersionSpecifier.from_scheme_version_spec_string("semver", "<= 2.1"),
109-
}
110-
resolved_ranges = set()
109+
]
110+
resolved_ranges = []
111111

112112
unaffected_versions, affected_versions = categorize_versions(
113113
all_versions,
@@ -130,7 +130,7 @@ def test_categorize_versions_with_only_affected_ranges():
130130
def test_categorize_versions_without_any_ranges():
131131
all_versions = {"1.0", "1.1", "2.0", "2.1", "3.0", "3.1"}
132132

133-
unaffected, affected = categorize_versions(all_versions, set(), set(), set())
133+
unaffected, affected = categorize_versions(all_versions, [], [], [])
134134

135135
assert len(unaffected) == 0
136136
assert len(affected) == 0

vulnerabilities/tests/test_safety_db.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ def test_import(self):
7474
with patch("vulnerabilities.importers.SafetyDbDataSource.set_api"):
7575
runner.run()
7676

77-
assert models.Vulnerability.objects.count() == 9
78-
assert models.VulnerabilityReference.objects.count() == 9
79-
assert models.PackageRelatedVulnerability.objects.filter(is_vulnerable=False).count() == 18
80-
assert models.PackageRelatedVulnerability.objects.filter(is_vulnerable=True).count() == 18
77+
assert models.Vulnerability.objects.count() == 8
78+
assert models.VulnerabilityReference.objects.count() == 8
79+
assert models.PackageRelatedVulnerability.objects.filter(is_vulnerable=False).count() == 15
80+
assert models.PackageRelatedVulnerability.objects.filter(is_vulnerable=True).count() == 17
8181

8282
expected_package_count = sum([len(v) for v in MOCK_VERSION_API.cache.values()])
8383
assert models.Package.objects.count() == expected_package_count
@@ -106,13 +106,6 @@ def test_import(self):
106106
cve_ids={"CVE-2016-6186"},
107107
)
108108

109-
self.assert_by_vulnerability(
110-
"pyup.io-38115",
111-
"zulip",
112-
{"2.0"},
113-
{"2.1.1", "2.1.2", "2.1.3"},
114-
)
115-
116109
self.assert_by_vulnerability(
117110
"pyup.io-38114",
118111
"zulip",

0 commit comments

Comments
 (0)