Skip to content

Commit 6e0787d

Browse files
committed
add unit tests
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent 16a5725 commit 6e0787d

3 files changed

Lines changed: 126 additions & 6 deletions

File tree

product_portfolio/importers.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,13 @@ def validate_toolkit_options(scan_options):
472472
options_str = " ".join(missing_options)
473473
raise ValidationError(f"The Scan run is missing those required options: {options_str}")
474474

475+
def _handle_package_dependencies(self, package_data, package_uid, dependencies_by_package_uid):
476+
if self.create_dependencies:
477+
if not package_data.get("dependencies"):
478+
package_data["dependencies"] = dependencies_by_package_uid.get(package_uid, [])
479+
else:
480+
package_data.pop("dependencies", None)
481+
475482
def import_packages(self):
476483
product_packages_count = 0
477484
packages_count = 0
@@ -491,12 +498,7 @@ def import_packages(self):
491498

492499
for package_data in packages:
493500
package_uid = package_data.get("package_uid")
494-
if self.create_dependencies:
495-
package_dependencies = package_data.get("dependencies", [])
496-
if not package_dependencies:
497-
package_data["dependencies"] = dependencies_by_package_uid.get(package_uid, [])
498-
else:
499-
package_data.pop("dependencies", None)
501+
self._handle_package_dependencies(package_data, package_uid, dependencies_by_package_uid)
500502

501503
prepared = PackageImporter.prepare_package(package_data, path="/")
502504
if not prepared:

product_portfolio/tests/test_importers.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
# See https://aboutcode.org for more information about AboutCode FOSS projects.
77
#
88

9+
import json
910
import tempfile
1011
import uuid
1112
from pathlib import Path
@@ -908,6 +909,36 @@ def test_product_portfolio_product_import_from_scan_input_data_validation_errors
908909
self.assertEqual(expected, warnings)
909910
self.assertEqual({"Packages": 1, "Product Packages": 1}, created_counts)
910911

912+
def test_product_portfolio_product_import_from_scan_create_dependencies(self):
913+
scan_input_location = self.testfiles_path / "import_from_scan_with_dependencies.json"
914+
915+
upload_file = wrap_as_temp_uploaded_file(scan_input_location)
916+
importer = ImportFromScan(
917+
self.product1, self.super_user, upload_file, create_dependencies=False
918+
)
919+
importer.save()
920+
package = self.product1.packages.get()
921+
self.assertEqual([], package.dependencies)
922+
923+
package.productpackages.all().delete()
924+
package.delete()
925+
926+
upload_file = wrap_as_temp_uploaded_file(scan_input_location)
927+
importer = ImportFromScan(
928+
self.product1, self.super_user, upload_file, create_dependencies=True
929+
)
930+
importer.save()
931+
package = self.product1.packages.get()
932+
expected_dependency = {
933+
"purl": "pkg:npm/lodash@4.17.21",
934+
"scope": "runtime",
935+
"is_runtime": True,
936+
"is_optional": False,
937+
"is_pinned": True,
938+
"for_package_uid": "pkg:npm/test-package@1?uuid=9779a0ea-ef30-4a05-b4db-0a0ba3b3507c",
939+
}
940+
self.assertEqual([expected_dependency], json.loads(package.dependencies))
941+
911942
def test_product_portfolio_product_import_from_scan_view_base(self):
912943
self.client.login(username=self.super_user.username, password="secret")
913944
scan_input_location = self.testfiles_path / "import_from_scan.json"
@@ -1060,6 +1091,56 @@ def test_product_portfolio_import_packages_from_scancodeio_importer(
10601091
importer.save()
10611092
mock_fetch.assert_called()
10621093

1094+
@mock.patch("dejacode_toolkit.scancodeio.ScanCodeIO.fetch_project_dependencies")
1095+
@mock.patch("dejacode_toolkit.scancodeio.ScanCodeIO.fetch_project_packages")
1096+
def test_product_portfolio_import_packages_from_scancodeio_create_dependencies(
1097+
self, mock_fetch_packages, mock_fetch_dependencies
1098+
):
1099+
purl = "pkg:maven/abc/abc@1.0"
1100+
mock_fetch_packages.return_value = [
1101+
{
1102+
"type": "maven",
1103+
"namespace": "abc",
1104+
"name": "abc",
1105+
"version": "1.0",
1106+
"purl": purl,
1107+
}
1108+
]
1109+
dependency_uid = "pkg:pypi/requests@2.0?uuid=test-dep"
1110+
mock_fetch_dependencies.return_value = [
1111+
{
1112+
"purl": "pkg:pypi/requests@2.0",
1113+
"dependency_uid": dependency_uid,
1114+
"for_package_uid": None,
1115+
"resolved_to_package_uid": None,
1116+
"scope": "install",
1117+
"is_runtime": True,
1118+
"is_optional": False,
1119+
"is_pinned": False,
1120+
"is_direct": True,
1121+
"datasource_id": "pypi_setup_cfg",
1122+
"affected_by_vulnerabilities": [],
1123+
}
1124+
]
1125+
1126+
importer = ImportPackageFromScanCodeIO(
1127+
user=self.super_user,
1128+
project_uuid=uuid.uuid4(),
1129+
product=self.product1,
1130+
create_dependencies=False,
1131+
)
1132+
importer.save()
1133+
self.assertEqual(0, self.product1.dependencies.count())
1134+
1135+
importer = ImportPackageFromScanCodeIO(
1136+
user=self.super_user,
1137+
project_uuid=uuid.uuid4(),
1138+
product=self.product1,
1139+
create_dependencies=True,
1140+
)
1141+
importer.save()
1142+
self.assertEqual(1, self.product1.dependencies.count())
1143+
10631144
@mock.patch("dejacode_toolkit.scancodeio.ScanCodeIO.fetch_project_dependencies")
10641145
@mock.patch("dejacode_toolkit.scancodeio.ScanCodeIO.fetch_project_packages")
10651146
def test_product_portfolio_import_packages_from_scio_importer_multiple_package_objs(
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{
2+
"headers": [
3+
{
4+
"tool_name": "scancode-toolkit",
5+
"tool_version": "32.0.0",
6+
"options": {
7+
"--copyright": true,
8+
"--info": true,
9+
"--license": true,
10+
"--package": true
11+
}
12+
}
13+
],
14+
"packages": [
15+
{
16+
"type": "npm",
17+
"name": "test-package",
18+
"version": "1",
19+
"purl": "pkg:npm/test-package@1",
20+
"package_uid": "pkg:npm/test-package@1?uuid=9779a0ea-ef30-4a05-b4db-0a0ba3b3507c",
21+
"download_url": "https://registry.npmjs.org/test-package/-/test-package-1.tgz",
22+
"copyright": "Copyright",
23+
"declared_license_expression": "apache-2.0"
24+
}
25+
],
26+
"dependencies": [
27+
{
28+
"purl": "pkg:npm/lodash@4.17.21",
29+
"scope": "runtime",
30+
"is_runtime": true,
31+
"is_optional": false,
32+
"is_pinned": true,
33+
"for_package_uid": "pkg:npm/test-package@1?uuid=9779a0ea-ef30-4a05-b4db-0a0ba3b3507c"
34+
}
35+
],
36+
"files": []
37+
}

0 commit comments

Comments
 (0)