Skip to content

Commit abe0d52

Browse files
committed
Refine the implementation and add unit tests
Signed-off-by: tdruez <[email protected]>
1 parent b3faa7d commit abe0d52

File tree

5 files changed

+79
-22
lines changed

5 files changed

+79
-22
lines changed

component_catalog/models.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2630,24 +2630,26 @@ def update_from_purldb(self, user):
26302630
)
26312631
return updated_fields
26322632

2633-
def update_from_scan(self, user, update_product_relations=False):
2634-
scancodeio = ScanCodeIO(self.dataspace)
2633+
def update_from_scan(self, user, update_products=False):
2634+
package = self
2635+
dataspace = self.dataspace
2636+
scancodeio = ScanCodeIO(dataspace)
2637+
26352638
can_update_from_scan = all(
26362639
[
2637-
self.dataspace.enable_package_scanning,
2638-
self.dataspace.update_packages_from_scan,
2640+
dataspace.enable_package_scanning,
2641+
dataspace.update_packages_from_scan,
26392642
scancodeio.is_configured(),
26402643
]
26412644
)
2642-
26432645
if not can_update_from_scan:
26442646
return
26452647

2646-
updated_fields = scancodeio.update_from_scan(package=self, user=user)
2648+
updated_fields = scancodeio.update_from_scan(package=package, user=user)
26472649

2648-
if update_product_relations and "declared_license_expression" in updated_fields:
2649-
for product_package in self.productpackages.license_unknown():
2650-
product_package.update_license_unknown()
2650+
if update_products:
2651+
if "declared_license_expression" in updated_fields:
2652+
package.productpackages.update_license_unknown()
26512653

26522654
return updated_fields
26532655

component_catalog/tests/test_models.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,22 +1769,30 @@ def test_package_model_create_from_url_enable_purldb_access(
17691769

17701770
@mock.patch("dejacode_toolkit.scancodeio.ScanCodeIO.is_configured")
17711771
@mock.patch("dejacode_toolkit.scancodeio.ScanCodeIO.update_from_scan")
1772-
def test_package_model_update_from_scan(self, mock_update_from_scan, mock_is_configured):
1772+
def test_package_model_update_from_scan(self, mock_scio_update_from_scan, mock_is_configured):
17731773
mock_is_configured.return_value = True
1774-
package1 = make_package(self.dataspace)
1774+
package1 = make_package(self.dataspace, declared_license_expression="mit")
1775+
product1 = make_product(self.dataspace, inventory=[package1])
1776+
1777+
pp1 = product1.productpackages.get()
1778+
self.assertEqual("", pp1.license_expression)
1779+
pp1.update(license_expression="unknown")
17751780

17761781
results = package1.update_from_scan(user=self.user)
1777-
mock_update_from_scan.assert_not_called()
1782+
mock_scio_update_from_scan.assert_not_called()
17781783
self.assertIsNone(results)
17791784

17801785
self.dataspace.enable_package_scanning = True
17811786
self.dataspace.update_packages_from_scan = True
17821787
self.dataspace.save()
17831788

1784-
mock_update_from_scan.return_value = ["updated_field"]
1785-
results = package1.update_from_scan(user=self.user)
1786-
mock_update_from_scan.assert_called()
1787-
self.assertEqual(["updated_field"], results)
1789+
mock_scio_update_from_scan.return_value = ["declared_license_expression"]
1790+
results = package1.update_from_scan(user=self.user, update_products=True)
1791+
mock_scio_update_from_scan.assert_called()
1792+
self.assertEqual(["declared_license_expression"], results)
1793+
1794+
pp1.refresh_from_db()
1795+
self.assertEqual("mit", pp1.license_expression)
17881796

17891797
def test_package_model_get_url_methods(self):
17901798
package = Package(

component_catalog/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1761,7 +1761,7 @@ def send_scan_notification(request, key):
17611761
run = json_data.get("run")
17621762
scan_status = run.get("status")
17631763
if scan_status.lower() == "success":
1764-
updated_fields = package.update_from_scan(user, update_product_relations=True)
1764+
updated_fields = package.update_from_scan(user, update_products=True)
17651765

17661766
if updated_fields:
17671767
description = (

product_portfolio/models.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -579,11 +579,8 @@ def improve_packages_from_purldb(self, user):
579579
# Update the Product Package relationship `license_expression` if the
580580
# Package.declared_license_expression was updated from "unknwon" value using
581581
# PurlDB data.
582-
productpackages_qs = self.productpackages.filter(
583-
package__in=updated_packages
584-
).license_unknown()
585-
for product_package in productpackages_qs:
586-
product_package.update_license_unknown()
582+
productpackages_qs = self.productpackages.filter(package__in=updated_packages)
583+
productpackages_qs.update_license_unknown()
587584

588585
return updated_packages
589586

@@ -708,6 +705,10 @@ def vulnerable(self):
708705
def license_unknown(self):
709706
return self.filter(license_expression="unknown")
710707

708+
def update_license_unknown(self):
709+
for product_package in self.license_unknown():
710+
product_package.update_license_unknown()
711+
711712
def annotate_weighted_risk_score(self):
712713
"""Annotate the Queeryset with the weighted_risk_score computed value."""
713714
purpose = ProductItemPurpose.objects.filter(productpackage=OuterRef("pk"))

product_portfolio/tests/test_models.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,19 @@ def test_productcomponent_model_is_custom_component(self):
780780
pc1.save()
781781
self.assertFalse(pc1.is_custom_component)
782782

783+
def test_productpackage_model_update_license_unknown(self):
784+
package1 = make_package(self.dataspace, declared_license_expression="mit")
785+
pp1 = make_product_package(self.product1, package=package1)
786+
787+
pp1.update_license_unknown()
788+
pp1.refresh_from_db()
789+
self.assertEqual("", pp1.license_expression)
790+
791+
pp1.update(license_expression="unknown")
792+
pp1.update_license_unknown()
793+
pp1.refresh_from_db()
794+
self.assertEqual("mit", pp1.license_expression)
795+
783796
def test_product_relationship_queryset_vulnerable(self):
784797
pp1 = make_product_package(self.product1)
785798
product_package_qs = ProductPackage.objects.vulnerable()
@@ -833,6 +846,39 @@ def test_product_relationship_queryset_update_weighted_risk_score(self):
833846
pp1.refresh_from_db()
834847
self.assertIsNone(pp1.weighted_risk_score)
835848

849+
def test_productpackage_queryset_license_unknown(self):
850+
package1 = make_package(self.dataspace, declared_license_expression="unknown")
851+
package2 = make_package(self.dataspace, declared_license_expression="mit")
852+
pp1 = make_product_package(self.product1, package=package1)
853+
pp2 = make_product_package(self.product1, package=package2)
854+
855+
qs = ProductPackage.objects.license_unknown()
856+
self.assertQuerySetEqual([], qs)
857+
858+
pp1.update(license_expression="unknown")
859+
pp2.update(license_expression="mit")
860+
qs = ProductPackage.objects.license_unknown()
861+
self.assertQuerySetEqual(qs, [pp1])
862+
863+
def test_productpackage_queryset_update_license_unknown(self):
864+
package1 = make_package(self.dataspace, declared_license_expression="mit")
865+
package2 = make_package(self.dataspace, declared_license_expression="mit")
866+
pp1 = make_product_package(self.product1, package=package1)
867+
pp2 = make_product_package(self.product1, package=package2)
868+
869+
ProductPackage.objects.update_license_unknown()
870+
pp1.refresh_from_db()
871+
pp2.refresh_from_db()
872+
self.assertEqual("", pp1.license_expression)
873+
self.assertEqual("", pp2.license_expression)
874+
875+
pp1.update(license_expression="unknown")
876+
ProductPackage.objects.update_license_unknown()
877+
pp1.refresh_from_db()
878+
pp2.refresh_from_db()
879+
self.assertEqual("mit", pp1.license_expression)
880+
self.assertEqual("", pp2.license_expression)
881+
836882
def test_productrelation_model_compute_weighted_risk_score(self):
837883
purpose1 = make_product_item_purpose(self.dataspace)
838884

0 commit comments

Comments
 (0)