Skip to content

Commit 3cc7299

Browse files
committed
Update tests related to V2 advisory
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent c7d6a31 commit 3cc7299

10 files changed

+47
-180
lines changed

vulnerabilities/tests/pipelines/test_collect_commits_v2.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
1+
#
2+
# Copyright (c) nexB Inc. and others. All rights reserved.
3+
# VulnerableCode is a trademark of nexB Inc.
4+
# SPDX-License-Identifier: Apache-2.0
5+
# See http://www.apache.org/licenses/LICENSE-2.0 for the license text.
6+
# See https://github.com/aboutcode-org/vulnerablecode for support or download.
7+
# See https://aboutcode.org for more information about nexB OSS projects.
8+
19
from datetime import datetime
2-
from unittest.mock import patch
310

411
import pytest
512

613
from vulnerabilities.models import AdvisoryReference
714
from vulnerabilities.models import AdvisoryV2
815
from vulnerabilities.models import CodeFixV2
16+
from vulnerabilities.models import ImpactedPackage
917
from vulnerabilities.models import PackageV2
1018
from vulnerabilities.pipelines.v2_improvers.collect_commits import CollectFixCommitsPipeline
1119
from vulnerabilities.pipelines.v2_improvers.collect_commits import is_vcs_url
@@ -59,8 +67,8 @@ def test_is_vcs_url_already_processed_true():
5967
name="foo",
6068
version="1.0",
6169
)
62-
advisory.affecting_packages.add(package)
63-
advisory.save()
70+
impact = ImpactedPackage.objects.create(advisory=advisory)
71+
impact.affecting_packages.add(package)
6472
CodeFixV2.objects.create(
6573
commits=["https://github.com/user/repo/commit/abc123"],
6674
advisory=advisory,
@@ -87,9 +95,9 @@ def test_collect_fix_commits_pipeline_creates_entry():
8795
reference = AdvisoryReference.objects.create(
8896
url="https://github.com/test/testpkg/commit/abc123"
8997
)
90-
advisory.affecting_packages.add(package)
98+
impact = ImpactedPackage.objects.create(advisory=advisory)
99+
impact.affecting_packages.add(package)
91100
advisory.references.add(reference)
92-
advisory.save()
93101

94102
pipeline = CollectFixCommitsPipeline()
95103
pipeline.collect_and_store_fix_commits()
@@ -117,13 +125,11 @@ def test_collect_fix_commits_pipeline_skips_non_commit_urls():
117125
name="otherpkg",
118126
version="2.0",
119127
)
120-
121-
advisory.affecting_packages.add(package)
128+
impact = ImpactedPackage.objects.create(advisory=advisory)
129+
impact.affecting_packages.add(package)
122130

123131
reference = AdvisoryReference.objects.create(url="https://github.com/test/testpkg/issues/12")
124-
125132
advisory.references.add(reference)
126-
advisory.save()
127133

128134
pipeline = CollectFixCommitsPipeline()
129135
pipeline.collect_and_store_fix_commits()

vulnerabilities/tests/pipelines/test_curl_importer_v2.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from univers.versions import SemverVersion
1717

1818
from vulnerabilities.importer import AdvisoryData
19-
from vulnerabilities.importer import AffectedPackage
19+
from vulnerabilities.importer import AffectedPackageV2
2020
from vulnerabilities.pipelines.v2_importers.curl_importer import CurlImporterPipeline
2121
from vulnerabilities.pipelines.v2_importers.curl_importer import get_cwe_from_curl_advisory
2222
from vulnerabilities.pipelines.v2_importers.curl_importer import parse_curl_advisory
@@ -74,9 +74,9 @@ def test_collect_advisories(mock_fetch, pipeline):
7474

7575
# Affected package check
7676
pkg = advisory.affected_packages[0]
77-
assert isinstance(pkg, AffectedPackage)
77+
assert isinstance(pkg, AffectedPackageV2)
7878
assert pkg.package == PackageURL(type="generic", namespace="curl.se", name="curl")
79-
assert pkg.fixed_version == SemverVersion("8.7.0")
79+
assert str(pkg.fixed_version_range) == "vers:generic/8.7.0"
8080
assert "8.6.0" in str(pkg.affected_version_range)
8181

8282
# References

vulnerabilities/tests/pipelines/test_gitlab_v2_importer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def test_collect_advisories(mock_gitlab_yaml, mock_vcs_response, mock_fetch_via_
9999
assert advisory.summary == "Example vulnerability\nExample description"
100100
assert advisory.references_v2[0].url == "https://example.com/advisory"
101101
assert advisory.affected_packages[0].package.name == "package-name"
102-
assert advisory.affected_packages[0].fixed_version
102+
assert str(advisory.affected_packages[0].fixed_version_range) == "vers:pypi/2.0.0"
103103
assert advisory.weaknesses[0] == 79
104104

105105

vulnerabilities/tests/pipelines/test_istio_importer_v2.py

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,8 @@
1212
from textwrap import dedent
1313

1414
import pytest
15-
from packageurl import PackageURL
16-
from univers.version_constraint import VersionConstraint
17-
from univers.version_range import GitHubVersionRange
18-
from univers.version_range import GolangVersionRange
19-
from univers.versions import SemverVersion
2015

2116
from vulnerabilities.importer import AdvisoryData
22-
from vulnerabilities.importer import AffectedPackage
2317
from vulnerabilities.importer import ReferenceV2
2418
from vulnerabilities.pipelines.v2_importers.istio_importer import IstioImporterPipeline
2519

@@ -77,24 +71,11 @@ def test_istio_advisory_parsing():
7771
url="https://istio.io/latest/news/security/ISTIO-SECURITY-2019-002/",
7872
)
7973

80-
expected_versions = [
81-
VersionConstraint(version=SemverVersion("1.0"), comparator=">="),
82-
VersionConstraint(version=SemverVersion("1.0.8"), comparator="<="),
83-
VersionConstraint(version=SemverVersion("1.1"), comparator=">="),
84-
VersionConstraint(version=SemverVersion("1.1.9"), comparator="<="),
85-
VersionConstraint(version=SemverVersion("1.2"), comparator=">="),
86-
VersionConstraint(version=SemverVersion("1.2.1"), comparator="<="),
87-
]
88-
89-
expected_packages = [
90-
AffectedPackage(
91-
package=PackageURL(type="golang", namespace="istio.io", name="istio"),
92-
affected_version_range=GolangVersionRange(constraints=expected_versions),
93-
),
94-
AffectedPackage(
95-
package=PackageURL(type="github", namespace="istio", name="istio"),
96-
affected_version_range=GitHubVersionRange(constraints=expected_versions),
97-
),
98-
]
99-
100-
assert advisory.affected_packages == expected_packages
74+
assert (
75+
str(advisory.affected_packages[0].affected_version_range)
76+
== "vers:github/>=1.0.0|<=1.0.8|>=1.1.0|<=1.1.9|>=1.2.0|<=1.2.1"
77+
)
78+
assert (
79+
str(advisory.affected_packages[1].affected_version_range)
80+
== "vers:golang/>=1.0.0|<=1.0.8|>=1.1.0|<=1.1.9|>=1.2.0|<=1.2.1"
81+
)

vulnerabilities/tests/pipelines/test_mozilla_importer_v2.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
from vulnerabilities.pipelines.v2_importers.mozilla_importer import get_severity_from_impact
1515
from vulnerabilities.pipelines.v2_importers.mozilla_importer import mfsa_id_from_filename
1616
from vulnerabilities.pipelines.v2_importers.mozilla_importer import parse_affected_packages
17-
from vulnerabilities.pipelines.v2_importers.mozilla_importer import parse_md_advisory
1817
from vulnerabilities.pipelines.v2_importers.mozilla_importer import parse_yml_advisory
1918

2019

@@ -57,7 +56,7 @@ def test_parse_affected_packages_valid():
5756
result = list(parse_affected_packages(packages))
5857
assert len(result) == 2
5958
assert result[0].package.name == "firefox"
60-
assert str(result[0].fixed_version) == "89.0.0"
59+
assert str(result[0].fixed_version_range) == "vers:generic/89.0.0"
6160

6261

6362
def test_parse_affected_packages_invalid():

vulnerabilities/tests/pipelines/test_npm_importer_pipeline_v2.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def test_to_advisory_data_full(tmp_path):
102102
pkg = adv.affected_packages[0]
103103
assert pkg.package == PackageURL(type="npm", name="mypkg")
104104
assert isinstance(pkg.affected_version_range, NpmVersionRange)
105-
assert pkg.fixed_version == SemverVersion("1.2.4")
105+
assert str(pkg.fixed_version_range) == "vers:npm/>=1.2.4"
106106
assert set(adv.aliases) == {"CVE-123", "CVE-124"}
107107

108108

@@ -121,8 +121,8 @@ def test_get_affected_package_special_and_standard():
121121
{"vulnerable_versions": "<=99.999.99999", "patched_versions": "<0.0.0"}, "pkg"
122122
)
123123
assert isinstance(pkg.affected_version_range, NpmVersionRange)
124-
assert pkg.fixed_version is None
124+
assert pkg.fixed_version_range is None
125125
data2 = {"vulnerable_versions": "<=2.0.0", "patched_versions": ">=2.0.1"}
126126
pkg2 = p.get_affected_package(data2, "pkg2")
127127
assert isinstance(pkg2.affected_version_range, NpmVersionRange)
128-
assert pkg2.fixed_version == SemverVersion("2.0.1")
128+
assert str(pkg2.fixed_version_range) == "vers:npm/>=2.0.1"

vulnerabilities/tests/pipelines/test_postgresql_v2_importer.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,20 +87,20 @@ def test_collect_advisories(mock_get, importer):
8787
assert "Description of the issue" in advisory.summary
8888
assert len(advisory.references_v2) > 0
8989
assert advisory.affected_packages[0].package.name == "postgresql"
90-
assert str(advisory.affected_packages[0].fixed_version) == "10.2"
90+
assert str(advisory.affected_packages[0].fixed_version_range) == "vers:generic/10.2.0"
9191
assert advisory.affected_packages[0].affected_version_range.contains(SemverVersion("10.0.0"))
9292
assert advisory.affected_packages[0].affected_version_range.contains(SemverVersion("10.1.0"))
9393

9494

9595
@patch("vulnerabilities.pipelines.v2_importers.postgresql_importer.requests.get")
96-
def test_collect_advisories_with_no_fixed_version(mock_get, importer):
96+
def test_collect_advisories_with_no_fixed_version_range(mock_get, importer):
9797
mock_get.return_value.content = HTML_NO_FIX_ADVISORY.encode("utf-8")
9898
advisories = list(importer.collect_advisories())
9999

100100
assert len(advisories) == 1
101101
advisory = advisories[0]
102102
assert advisory.advisory_id == "CVE-2023-5678"
103-
assert advisory.affected_packages[0].fixed_version is None
103+
assert advisory.affected_packages[0].fixed_version_range is None
104104
assert advisory.affected_packages[0].affected_version_range.contains(SemverVersion("9.5"))
105105
assert advisory.affected_packages[0].affected_version_range.contains(SemverVersion("9.6"))
106106

vulnerabilities/tests/pipelines/test_vulnerablecode_importer_v2_pipeline.py

Lines changed: 0 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,11 @@
1010
import logging
1111
from datetime import datetime
1212
from datetime import timedelta
13-
from unittest import mock
1413

1514
import pytest
16-
from packageurl import PackageURL
1715

1816
from vulnerabilities.importer import AdvisoryData
19-
from vulnerabilities.importer import UnMergeablePackageError
2017
from vulnerabilities.models import AdvisoryV2
21-
from vulnerabilities.models import PackageV2
2218
from vulnerabilities.pipelines import VulnerableCodeBaseImporterPipelineV2
2319

2420

@@ -64,117 +60,3 @@ def test_collect_and_store_advisories(dummy_importer):
6460
assert len(dummy_importer.log_messages) >= 2
6561
assert "Successfully collected" in dummy_importer.log_messages[-1][1]
6662
assert AdvisoryV2.objects.count() == 1
67-
68-
69-
def test_get_advisory_packages_basic(dummy_importer):
70-
purl = PackageURL("pypi", None, "dummy", "1.0.0")
71-
affected_package = mock.Mock()
72-
affected_package.package = purl
73-
dummy_importer.unfurl_version_ranges = False
74-
75-
with mock.patch(
76-
"vulnerabilities.improvers.default.get_exact_purls", return_value=([purl], [purl])
77-
):
78-
with mock.patch.object(
79-
PackageV2.objects, "get_or_create_from_purl", return_value=(mock.Mock(), True)
80-
) as mock_get:
81-
dummy_importer.get_advisory_packages(
82-
advisory_data=mock.Mock(affected_packages=[affected_package])
83-
)
84-
assert mock_get.call_count == 2 # one affected, one fixed
85-
86-
87-
def test_get_published_package_versions_filters(dummy_importer):
88-
purl = PackageURL("pypi", None, "example", None)
89-
90-
dummy_versions = [
91-
mock.Mock(value="1.0.0", release_date=datetime.now() - timedelta(days=5)),
92-
mock.Mock(value="2.0.0", release_date=datetime.now() + timedelta(days=5)), # future
93-
]
94-
95-
with mock.patch(
96-
"vulnerabilities.pipelines.package_versions.versions", return_value=dummy_versions
97-
):
98-
versions = dummy_importer.get_published_package_versions(purl, until=datetime.now())
99-
assert "1.0.0" in versions
100-
assert "2.0.0" not in versions
101-
102-
103-
def test_get_published_package_versions_failure_logs(dummy_importer):
104-
purl = PackageURL("pypi", None, "example", None)
105-
with mock.patch(
106-
"vulnerabilities.pipelines.package_versions.versions", side_effect=Exception("fail")
107-
):
108-
versions = dummy_importer.get_published_package_versions(purl)
109-
assert versions == []
110-
assert any("Failed to fetch versions" in msg for lvl, msg in dummy_importer.log_messages)
111-
112-
113-
def test_expand_version_range_to_purls(dummy_importer):
114-
purls = list(
115-
dummy_importer.expand_verion_range_to_purls("npm", "lodash", "lodash", ["1.0.0", "1.1.0"])
116-
)
117-
assert all(isinstance(p, PackageURL) for p in purls)
118-
assert purls[0].name == "lodash"
119-
120-
121-
def test_resolve_package_versions(dummy_importer):
122-
dummy_importer.ignorable_versions = []
123-
dummy_importer.expand_verion_range_to_purls = lambda *args, **kwargs: [
124-
PackageURL("npm", None, "a", "1.0.0")
125-
]
126-
127-
with mock.patch(
128-
"vulnerabilities.pipelines.resolve_version_range", return_value=(["1.0.0"], ["1.1.0"])
129-
), mock.patch(
130-
"vulnerabilities.pipelines.get_affected_packages_by_patched_package",
131-
return_value={None: [PackageURL("npm", None, "a", "1.0.0")]},
132-
), mock.patch(
133-
"vulnerabilities.pipelines.nearest_patched_package", return_value=[]
134-
):
135-
aff, fix = dummy_importer.resolve_package_versions(
136-
affected_version_range=">=1.0.0",
137-
pkg_type="npm",
138-
pkg_namespace=None,
139-
pkg_name="a",
140-
valid_versions=["1.0.0", "1.1.0"],
141-
)
142-
assert any(isinstance(p, PackageURL) for p in aff)
143-
144-
145-
def test_get_impacted_packages_mergeable(dummy_importer):
146-
ap = mock.Mock()
147-
ap.package = PackageURL("npm", None, "abc", None)
148-
dummy_importer.get_published_package_versions = lambda package_url, until: ["1.0.0", "1.1.0"]
149-
dummy_importer.resolve_package_versions = lambda **kwargs: (
150-
[PackageURL("npm", None, "abc", "1.0.0")],
151-
[PackageURL("npm", None, "abc", "1.1.0")],
152-
)
153-
154-
with mock.patch(
155-
"vulnerabilities.importer.AffectedPackage.merge",
156-
return_value=(ap.package, [">=1.0.0"], ["1.1.0"]),
157-
):
158-
aff, fix = dummy_importer.get_impacted_packages([ap], datetime.now())
159-
assert len(aff) == 1 and aff[0].version == "1.0.0"
160-
assert len(fix) == 1 and fix[0].version == "1.1.0"
161-
162-
163-
def test_get_impacted_packages_unmergeable(dummy_importer):
164-
ap = mock.Mock()
165-
ap.package = PackageURL("npm", None, "abc", None)
166-
ap.affected_version_range = ">=1.0.0"
167-
ap.fixed_version = None
168-
169-
dummy_importer.get_published_package_versions = lambda package_url, until: ["1.0.0", "1.1.0"]
170-
dummy_importer.resolve_package_versions = lambda **kwargs: (
171-
[PackageURL("npm", None, "abc", "1.0.0")],
172-
[PackageURL("npm", None, "abc", "1.1.0")],
173-
)
174-
175-
with mock.patch(
176-
"vulnerabilities.importer.AffectedPackage.merge", side_effect=UnMergeablePackageError
177-
):
178-
aff, fix = dummy_importer.get_impacted_packages([ap], datetime.utcnow())
179-
assert len(aff) == 1
180-
assert aff[0].version == "1.0.0"

vulnerabilities/tests/pipelines/test_compute_package_risk_v2.py renamed to vulnerabilities/tests/pipelines/v2_improvers/test_compute_package_risk_v2.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from vulnerabilities.models import AdvisorySeverity
1515
from vulnerabilities.models import AdvisoryV2
1616
from vulnerabilities.models import AdvisoryWeakness
17+
from vulnerabilities.models import ImpactedPackage
1718
from vulnerabilities.models import PackageV2
1819
from vulnerabilities.pipelines.v2_improvers.compute_package_risk import ComputePackageRiskPipeline
1920
from vulnerabilities.severity_systems import CVSSV3
@@ -54,8 +55,8 @@ def test_simple_risk_pipeline():
5455
weaknesses = AdvisoryWeakness.objects.create(cwe_id=119)
5556
adv.weaknesses.add(weaknesses)
5657

57-
adv.affecting_packages.add(pkg)
58-
adv.save()
58+
impact = ImpactedPackage.objects.create(advisory=adv)
59+
impact.affecting_packages.add(pkg)
5960

6061
improver = ComputePackageRiskPipeline()
6162
improver.execute()

0 commit comments

Comments
 (0)