|
12 | 12 |
|
13 | 13 | from rest_framework import status |
14 | 14 |
|
| 15 | +from component_catalog.tests import make_package |
15 | 16 | from dje.models import Dataspace |
16 | 17 | from dje.tests import create_superuser |
17 | 18 | from product_portfolio.models import Product |
| 19 | +from product_portfolio.tests import make_product |
| 20 | +from product_portfolio.tests import make_product_package |
| 21 | +from vulnerabilities.tests import make_vulnerability |
| 22 | +from vulnerabilities.triage.engine import evaluate_ruleset |
18 | 23 | from vulnerabilities.triage.models import AnalysisPreset |
19 | 24 | from vulnerabilities.triage.models import TriageAction |
| 25 | +from vulnerabilities.triage.models import TriageRecord |
20 | 26 | from vulnerabilities.triage.models import TriageRuleset |
21 | 27 | from vulnerabilities.triage.tests import make_analysis_preset |
| 28 | +from vulnerabilities.triage.tests import make_product_triage_ruleset |
22 | 29 | from vulnerabilities.triage.tests import make_triage_ruleset |
23 | 30 | from workflow.models import RequestTemplate |
24 | 31 |
|
@@ -165,6 +172,42 @@ def test_api_triageruleset_endpoint_update(self): |
165 | 172 | self.ruleset.refresh_from_db() |
166 | 173 | self.assertFalse(self.ruleset.enabled) |
167 | 174 |
|
| 175 | + def test_api_triageruleset_endpoint_update_reevaluates_assigned_products(self): |
| 176 | + # Regression: editing a ruleset via the API must re-evaluate its assigned |
| 177 | + # products, matching what already happens when editing it in the Admin. |
| 178 | + self.client.login(username="super_user", password="secret") |
| 179 | + product = make_product(self.dataspace) |
| 180 | + package = make_package(self.dataspace) |
| 181 | + make_product_package(product, package=package) |
| 182 | + vulnerability = make_vulnerability(self.dataspace, affecting=package, risk_score=9.0) |
| 183 | + make_product_triage_ruleset(product, ruleset=self.ruleset) |
| 184 | + self.assertFalse(TriageRecord.objects.exists()) |
| 185 | + |
| 186 | + data = {"rules_config": {"risk_score": {"is_active": True, "min_risk_score": 8.0}}} |
| 187 | + response = self.client.patch(self.detail_url, data=data, content_type="application/json") |
| 188 | + |
| 189 | + self.assertEqual(status.HTTP_200_OK, response.status_code) |
| 190 | + record = TriageRecord.objects.get() |
| 191 | + self.assertEqual(vulnerability, record.vulnerability) |
| 192 | + |
| 193 | + def test_api_triageruleset_endpoint_disabling_deletes_its_triage_records(self): |
| 194 | + self.client.login(username="super_user", password="secret") |
| 195 | + product = make_product(self.dataspace) |
| 196 | + package = make_package(self.dataspace) |
| 197 | + make_product_package(product, package=package) |
| 198 | + make_vulnerability(self.dataspace, affecting=package, risk_score=9.0) |
| 199 | + self.ruleset.rules_config = {"risk_score": {"is_active": True, "min_risk_score": 8.0}} |
| 200 | + self.ruleset.save() |
| 201 | + make_product_triage_ruleset(product, ruleset=self.ruleset) |
| 202 | + evaluate_ruleset(self.ruleset, product) |
| 203 | + self.assertTrue(TriageRecord.objects.exists()) |
| 204 | + |
| 205 | + data = {"enabled": False} |
| 206 | + response = self.client.patch(self.detail_url, data=data, content_type="application/json") |
| 207 | + |
| 208 | + self.assertEqual(status.HTTP_200_OK, response.status_code) |
| 209 | + self.assertFalse(TriageRecord.objects.exists()) |
| 210 | + |
168 | 211 | def test_api_triageruleset_endpoint_delete(self): |
169 | 212 | self.client.login(username="super_user", password="secret") |
170 | 213 | response = self.client.delete(self.detail_url) |
|
0 commit comments