|
24 | 24 | from component_catalog.models import Component |
25 | 25 | from component_catalog.models import ComponentKeyword |
26 | 26 | from component_catalog.models import Package |
| 27 | +from component_catalog.tests import make_package |
27 | 28 | from dje.models import Dataspace |
28 | 29 | from dje.models import History |
29 | 30 | from dje.tests import MaxQueryMixin |
|
47 | 48 | from product_portfolio.models import ProductRelationStatus |
48 | 49 | from product_portfolio.models import ProductStatus |
49 | 50 | from product_portfolio.models import ScanCodeProject |
| 51 | +from product_portfolio.tests import make_product_package |
50 | 52 | from vulnerabilities.tests import make_vulnerability |
51 | 53 | from vulnerabilities.tests import make_vulnerability_analysis |
| 54 | +from vulnerabilities.triage.engine import evaluate_ruleset |
| 55 | +from vulnerabilities.triage.models import TriageAction |
| 56 | +from vulnerabilities.triage.tests import make_product_triage_ruleset |
| 57 | +from vulnerabilities.triage.tests import make_triage_ruleset |
52 | 58 |
|
53 | 59 |
|
54 | 60 | class ProductAPITestCase(MaxQueryMixin, TestCase): |
@@ -758,6 +764,43 @@ def test_api_product_endpoint_policy_violations_action(self): |
758 | 764 | self.assertEqual(status.HTTP_200_OK, response.status_code) |
759 | 765 | self.assertEqual([], response.data) |
760 | 766 |
|
| 767 | + def test_api_product_endpoint_triage_records_action(self): |
| 768 | + url = reverse("api_v2:product-triage-records", args=[self.product1.uuid]) |
| 769 | + |
| 770 | + self.client.login(username=self.base_user.username, password="secret") |
| 771 | + response = self.client.get(url) |
| 772 | + self.assertEqual(status.HTTP_404_NOT_FOUND, response.status_code) |
| 773 | + |
| 774 | + add_perm(self.base_user, "add_product") |
| 775 | + assign_perm("view_product", self.base_user, self.product1) |
| 776 | + |
| 777 | + response = self.client.get(url) |
| 778 | + self.assertEqual(status.HTTP_200_OK, response.status_code) |
| 779 | + self.assertEqual([], response.data) |
| 780 | + |
| 781 | + package = make_package(self.dataspace) |
| 782 | + make_product_package(self.product1, package=package) |
| 783 | + vulnerability = make_vulnerability(self.dataspace, affecting=package, risk_score=9.0) |
| 784 | + ruleset = make_triage_ruleset( |
| 785 | + self.dataspace, |
| 786 | + recommended_action=TriageAction.UPGRADE, |
| 787 | + rules_config={"risk_score": {"is_active": True, "min_risk_score": 8.0}}, |
| 788 | + ) |
| 789 | + make_product_triage_ruleset(self.product1, ruleset=ruleset) |
| 790 | + evaluate_ruleset(ruleset, self.product1) |
| 791 | + |
| 792 | + response = self.client.get(url) |
| 793 | + self.assertEqual(status.HTTP_200_OK, response.status_code) |
| 794 | + self.assertEqual(1, len(response.data)) |
| 795 | + entry = response.data[0] |
| 796 | + self.assertEqual(vulnerability.advisory_id, entry["advisory_id"]) |
| 797 | + self.assertEqual(ruleset.name, entry["ruleset"]) |
| 798 | + self.assertEqual(TriageAction.UPGRADE, entry["recommended_action"]) |
| 799 | + self.assertEqual(["risk_score"], entry["matched_rules"]) |
| 800 | + self.assertIsNone(entry["request"]) |
| 801 | + self.assertIn("detected_date", entry) |
| 802 | + self.assertIn("last_checked", entry) |
| 803 | + |
761 | 804 |
|
762 | 805 | class ProductRelatedAPITestCase(TestCase): |
763 | 806 | def setUp(self): |
|
0 commit comments