|
8 | 8 | # |
9 | 9 |
|
10 | 10 | import os |
| 11 | +import time |
11 | 12 |
|
12 | 13 | import pytest |
13 | 14 | from django.test import Client |
14 | 15 | from django.test import TestCase |
15 | 16 | from packageurl import PackageURL |
16 | 17 | from univers import versions |
17 | 18 |
|
| 19 | +from vulnerabilities import models |
| 20 | +from vulnerabilities.models import AffectedByPackageRelatedVulnerability |
18 | 21 | from vulnerabilities.models import Alias |
| 22 | +from vulnerabilities.models import FixingPackageRelatedVulnerability |
19 | 23 | from vulnerabilities.models import Package |
20 | 24 | from vulnerabilities.models import Vulnerability |
| 25 | +from vulnerabilities.models import VulnerabilitySeverity |
21 | 26 | from vulnerabilities.templatetags.url_filters import url_quote_filter |
22 | 27 | from vulnerabilities.views import PackageDetails |
23 | 28 | from vulnerabilities.views import PackageSearch |
@@ -273,3 +278,56 @@ class TestCustomFilters: |
273 | 278 | def test_url_quote_filter(self, input_value, expected_output): |
274 | 279 | filtered = url_quote_filter(input_value) |
275 | 280 | assert filtered == expected_output |
| 281 | + |
| 282 | + |
| 283 | +class VulnerabilitySearchTestCaseWithPackages(TestCase): |
| 284 | + def setUp(self): |
| 285 | + self.vuln1 = Vulnerability.objects.create(vulnerability_id="VCID-1", summary="Vuln 1") |
| 286 | + self.vuln2 = Vulnerability.objects.create(vulnerability_id="VCID-2", summary="Vuln 2") |
| 287 | + self.vuln3 = Vulnerability.objects.create(vulnerability_id="VCID-3", summary="Vuln 3") |
| 288 | + self.vuln4 = Vulnerability.objects.create(vulnerability_id="VCID-4", summary="Vuln 4") |
| 289 | + self.vuln5 = Vulnerability.objects.create(vulnerability_id="VCID-5", summary="Vuln 5") |
| 290 | + |
| 291 | + self.package1 = Package.objects.create(type="pypi", name="django", version="1.0.0") |
| 292 | + self.package2 = Package.objects.create(type="pypi", name="django", version="2.0.0") |
| 293 | + self.package3 = Package.objects.create(type="pypi", name="django", version="3.0.0") |
| 294 | + |
| 295 | + AffectedByPackageRelatedVulnerability.objects.create( |
| 296 | + package=self.package1, vulnerability=self.vuln1 |
| 297 | + ) |
| 298 | + AffectedByPackageRelatedVulnerability.objects.create( |
| 299 | + package=self.package1, vulnerability=self.vuln2 |
| 300 | + ) |
| 301 | + AffectedByPackageRelatedVulnerability.objects.create( |
| 302 | + package=self.package2, vulnerability=self.vuln3 |
| 303 | + ) |
| 304 | + AffectedByPackageRelatedVulnerability.objects.create( |
| 305 | + package=self.package2, vulnerability=self.vuln4 |
| 306 | + ) |
| 307 | + |
| 308 | + FixingPackageRelatedVulnerability.objects.create( |
| 309 | + package=self.package3, vulnerability=self.vuln5 |
| 310 | + ) |
| 311 | + |
| 312 | + self.severity1 = VulnerabilitySeverity.objects.create( |
| 313 | + scoring_system="CVSSv3", |
| 314 | + value="9.8", |
| 315 | + scoring_elements="AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", |
| 316 | + ) |
| 317 | + self.severity2 = VulnerabilitySeverity.objects.create( |
| 318 | + scoring_system="CVSSv3", |
| 319 | + value="7.5", |
| 320 | + scoring_elements="AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", |
| 321 | + ) |
| 322 | + |
| 323 | + self.vuln1.severities.add(self.severity1) |
| 324 | + self.vuln1.severities.add(self.severity2) |
| 325 | + self.vuln1.save() |
| 326 | + |
| 327 | + def test_aggregate_fixed_and_affected_packages(self): |
| 328 | + with self.assertNumQueries(11): |
| 329 | + start_time = time.time() |
| 330 | + response = self.client.get(f"/vulnerabilities/{self.vuln1.vulnerability_id}") |
| 331 | + end_time = time.time() |
| 332 | + assert end_time - start_time < 0.05 |
| 333 | + self.assertEqual(response.status_code, 200) |
0 commit comments