Skip to content

Commit afd9d53

Browse files
committed
test: populate is_latest in old advisory fixture
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent 55b87ae commit afd9d53

File tree

5 files changed

+60
-106
lines changed

5 files changed

+60
-106
lines changed

vulnerabilities/tests/pipelines/v2_improvers/test_collect_ssvc_trees.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def vulnrichment_advisory(db):
3636
url="https://example.com/advisory/TEST-2024-0001",
3737
unique_content_id="unique-1234",
3838
date_collected=datetime.now(),
39+
is_latest=True,
3940
)
4041

4142

@@ -59,6 +60,7 @@ def related_advisory(db):
5960
url="https://example.com/related/TEST-2024-0001",
6061
unique_content_id="unique-5678",
6162
date_collected=datetime.now(),
63+
is_latest=True,
6264
)
6365

6466

vulnerabilities/tests/pipelines/v2_improvers/test_compute_package_risk_v2.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ def test_simple_risk_pipeline():
3434
unique_content_id="ajkef",
3535
url="https://test.com",
3636
date_collected=datetime.now(),
37+
is_latest=True,
3738
)
3839
adv.save()
3940

vulnerabilities/tests/pipelines/v2_improvers/test_relate_severities.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def test_relate_severities_by_advisory_id():
2525
unique_content_id="ab1",
2626
url="https://example.com/advisory/CVE-2024-0001",
2727
date_collected="2024-01-01",
28+
is_latest=True,
2829
)
2930

3031
severity_advisory = AdvisoryV2.objects.create(
@@ -34,6 +35,7 @@ def test_relate_severities_by_advisory_id():
3435
unique_content_id="ab2",
3536
url="https://example.com/epss/CVE-2024-0001",
3637
date_collected="2024-01-02",
38+
is_latest=True,
3739
)
3840
severity_advisory.severities.create(
3941
scoring_system=EPSS.identifier,
@@ -59,6 +61,7 @@ def test_relate_severities_via_alias():
5961
unique_content_id="ab3",
6062
url="https://example.com/advisory/CVE-2024-0002",
6163
date_collected="2024-01-01",
64+
is_latest=True,
6265
)
6366

6467
base.aliases.create(alias="CVE-2024-ALIAS")
@@ -70,6 +73,7 @@ def test_relate_severities_via_alias():
7073
unique_content_id="ab4",
7174
url="https://example.com/epss/CVE-2024-ALIAS",
7275
date_collected="2024-01-02",
76+
is_latest=True,
7377
)
7478
severity_advisory.severities.create(
7579
scoring_system=EPSS.identifier,
@@ -91,6 +95,7 @@ def test_no_self_relation_created():
9195
url="https://example.com/advisory/CVE-2024-0003",
9296
date_collected="2024-01-03",
9397
avid="epss/CVE-2024-0003",
98+
is_latest=True,
9499
)
95100
advisory.severities.create(
96101
scoring_system=EPSS.identifier,
@@ -112,6 +117,7 @@ def test_unsupported_severity_system_is_ignored():
112117
url="https://example.com/advisory/CVE-2024-0004",
113118
date_collected="2024-01-01",
114119
avid="nvd/CVE-2024-0004",
120+
is_latest=True,
115121
)
116122

117123
severity_advisory = AdvisoryV2.objects.create(
@@ -121,6 +127,7 @@ def test_unsupported_severity_system_is_ignored():
121127
url="https://example.com/epss/CVE-2024-0004",
122128
date_collected="2024-01-02",
123129
avid="epss/CVE-2024-0004",
130+
is_latest=True,
124131
)
125132
severity_advisory.severities.create(
126133
scoring_system="UNKNOWN_SYSTEM",
@@ -142,6 +149,7 @@ def test_pipeline_is_idempotent():
142149
url="https://example.com/advisory/CVE-2024-0005",
143150
date_collected="2024-01-01",
144151
avid="nvd/CVE-2024-0005",
152+
is_latest=True,
145153
)
146154

147155
severity = AdvisoryV2.objects.create(
@@ -150,6 +158,7 @@ def test_pipeline_is_idempotent():
150158
unique_content_id="ab9",
151159
url="https://example.com/epss/CVE-2024-0005",
152160
date_collected="2024-01-02",
161+
is_latest=True,
153162
avid="epss/CVE-2024-0005",
154163
)
155164
severity.severities.create(

vulnerabilities/tests/test_api_v3.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,26 @@
1414
from rest_framework.test import APITestCase
1515
from univers.version_range import PypiVersionRange
1616

17+
from vulnerabilities.importer import AdvisoryDataV2
1718
from vulnerabilities.models import AdvisoryV2
1819
from vulnerabilities.models import PackageV2
1920
from vulnerabilities.pipes.advisory import insert_advisory_v2
21+
from vulnerabilities.tests.pipelines import TestLogger
2022

2123

2224
class APIV3TestCase(APITestCase):
2325
def setUp(self):
2426
from vulnerabilities.models import ImpactedPackage
2527

26-
self.advisory = AdvisoryV2.objects.create(
27-
datasource_id="ghsa",
28-
advisory_id="GHSA-1234",
29-
avid="ghsa/GHSA-1234",
30-
unique_content_id="f" * 64,
31-
url="https://example.com/advisory",
32-
date_collected="2025-07-01T00:00:00Z",
28+
self.logger = TestLogger()
29+
self.advisory = insert_advisory_v2(
30+
advisory=AdvisoryDataV2(
31+
summary="summary",
32+
advisory_id="GHSA-1234",
33+
url="https://example.com/advisory",
34+
),
35+
pipeline_id="ghsa",
36+
logger=self.logger.write,
3337
)
3438

3539
self.package = PackageV2.objects.from_purl(purl="pkg:pypi/sample@1.0.0")

vulnerabilities/tests/test_same_avid_different_content_id.py

Lines changed: 37 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
99

10-
import uuid
11-
from datetime import timedelta
12-
1310
import pytest
14-
from django.utils.timezone import now
1511

12+
from vulnerabilities.importer import AdvisoryDataV2
1613
from vulnerabilities.models import AdvisoryV2
14+
from vulnerabilities.pipes.advisory import insert_advisory_v2
15+
from vulnerabilities.tests.pipelines import TestLogger
16+
17+
logger = TestLogger()
1718

1819

1920
@pytest.fixture
@@ -22,45 +23,29 @@ def advisory_factory(db):
2223
Factory to create AdvisoryV2 objects with minimal required fields.
2324
"""
2425

25-
def _create(*, avid, advisory_id, collected_at):
26-
return AdvisoryV2.objects.create(
27-
datasource_id="test_source",
28-
advisory_id=advisory_id,
29-
avid=avid,
30-
unique_content_id=str(uuid.uuid4()),
31-
url="https://example.com/advisory",
32-
date_collected=collected_at,
26+
def _create(*, advisory_id, summary):
27+
28+
return insert_advisory_v2(
29+
advisory=AdvisoryDataV2(
30+
summary=summary,
31+
advisory_id=advisory_id,
32+
url="https://example.com/advisory",
33+
),
34+
pipeline_id="source",
35+
logger=logger.write,
3336
)
3437

3538
return _create
3639

3740

38-
@pytest.fixture
39-
def timestamps():
40-
now_ts = now()
41-
return {
42-
"old": now_ts - timedelta(days=3),
43-
"mid": now_ts - timedelta(days=1),
44-
"new": now_ts,
45-
}
46-
47-
4841
@pytest.mark.django_db
4942
def test_latest_for_avid_returns_latest_by_date_collected(
50-
advisory_factory, timestamps, django_assert_num_queries
43+
advisory_factory, django_assert_num_queries
5144
):
5245
avid = "source/ADV-1"
5346

54-
older = advisory_factory(
55-
avid=avid,
56-
advisory_id="ADV-1",
57-
collected_at=timestamps["old"],
58-
)
59-
newer = advisory_factory(
60-
avid=avid,
61-
advisory_id="ADV-1",
62-
collected_at=timestamps["new"],
63-
)
47+
older = advisory_factory(advisory_id="ADV-1", summary="old advisory")
48+
newer = advisory_factory(advisory_id="ADV-1", summary="new advisory")
6449

6550
with django_assert_num_queries(1):
6651
result = AdvisoryV2.objects.latest_for_avid(avid)
@@ -70,20 +55,11 @@ def test_latest_for_avid_returns_latest_by_date_collected(
7055

7156

7257
@pytest.mark.django_db
73-
def test_latest_for_avid_tie_breaks_by_id(advisory_factory, timestamps, django_assert_num_queries):
58+
def test_latest_for_avid_tie_breaks_by_id(advisory_factory, django_assert_num_queries):
7459
avid = "source/ADV-2"
75-
ts = timestamps["mid"]
76-
77-
first = advisory_factory(
78-
avid=avid,
79-
advisory_id="ADV-2",
80-
collected_at=ts,
81-
)
82-
second = advisory_factory(
83-
avid=avid,
84-
advisory_id="ADV-2",
85-
collected_at=ts,
86-
)
60+
61+
first = advisory_factory(advisory_id="ADV-2", summary="old advisory")
62+
second = advisory_factory(advisory_id="ADV-2", summary="new advisory")
8763

8864
with django_assert_num_queries(1):
8965
result = AdvisoryV2.objects.latest_for_avid(avid)
@@ -92,25 +68,11 @@ def test_latest_for_avid_tie_breaks_by_id(advisory_factory, timestamps, django_a
9268

9369

9470
@pytest.mark.django_db
95-
def test_latest_per_avid_returns_one_row_per_avid(
96-
advisory_factory, timestamps, django_assert_num_queries
97-
):
98-
advisory_factory(
99-
avid="source/A",
100-
advisory_id="A",
101-
collected_at=timestamps["old"],
102-
)
103-
latest_a = advisory_factory(
104-
avid="source/A",
105-
advisory_id="A",
106-
collected_at=timestamps["new"],
107-
)
108-
109-
latest_b = advisory_factory(
110-
avid="source/B",
111-
advisory_id="B",
112-
collected_at=timestamps["mid"],
113-
)
71+
def test_latest_per_avid_returns_one_row_per_avid(advisory_factory, django_assert_num_queries):
72+
advisory_factory(advisory_id="A", summary="old advisory")
73+
latest_a = advisory_factory(advisory_id="A", summary="new advisory")
74+
75+
latest_b = advisory_factory(advisory_id="B", summary="new advisory")
11476

11577
with django_assert_num_queries(1):
11678
qs = AdvisoryV2.objects.latest_per_avid()
@@ -122,19 +84,11 @@ def test_latest_per_avid_returns_one_row_per_avid(
12284

12385

12486
@pytest.mark.django_db
125-
def test_latest_per_avid_excludes_older_versions(advisory_factory, timestamps):
87+
def test_latest_per_avid_excludes_older_versions(advisory_factory):
12688
avid = "source/C"
12789

128-
older = advisory_factory(
129-
avid=avid,
130-
advisory_id="C",
131-
collected_at=timestamps["old"],
132-
)
133-
latest = advisory_factory(
134-
avid=avid,
135-
advisory_id="C",
136-
collected_at=timestamps["new"],
137-
)
90+
older = advisory_factory(advisory_id="C", summary="old advisory")
91+
latest = advisory_factory(advisory_id="C", summary="new advisory")
13892

13993
results = list(AdvisoryV2.objects.latest_per_avid())
14094

@@ -144,30 +98,14 @@ def test_latest_per_avid_excludes_older_versions(advisory_factory, timestamps):
14498

14599
@pytest.mark.django_db
146100
def test_latest_for_avids_filters_and_collapses_correctly(
147-
advisory_factory, timestamps, django_assert_num_queries
101+
advisory_factory, django_assert_num_queries
148102
):
149-
advisory_factory(
150-
avid="source/A",
151-
advisory_id="A",
152-
collected_at=timestamps["old"],
153-
)
154-
latest_a = advisory_factory(
155-
avid="source/A",
156-
advisory_id="A",
157-
collected_at=timestamps["new"],
158-
)
159-
160-
latest_b = advisory_factory(
161-
avid="source/B",
162-
advisory_id="B",
163-
collected_at=timestamps["mid"],
164-
)
165-
166-
advisory_factory(
167-
avid="source/C",
168-
advisory_id="C",
169-
collected_at=timestamps["new"],
170-
)
103+
104+
advisory_factory(advisory_id="A", summary="old advisory")
105+
latest_a = advisory_factory(advisory_id="A", summary="new advisory")
106+
107+
advisory_factory(advisory_id="B", summary="old advisory")
108+
latest_b = advisory_factory(advisory_id="B", summary="new advisory")
171109

172110
with django_assert_num_queries(1):
173111
qs = AdvisoryV2.objects.latest_for_avids({"source/A", "source/B"})

0 commit comments

Comments
 (0)