@@ -1120,3 +1120,92 @@ def test_product_portfolio_import_packages_from_scio_importer_multiple_package_o
11201120 )
11211121 self .assertEqual ({}, existing )
11221122 self .assertEqual ({}, errors )
1123+
1124+ @mock .patch ("dejacode_toolkit.scancodeio.ScanCodeIO.fetch_project_dependencies" )
1125+ @mock .patch ("dejacode_toolkit.scancodeio.ScanCodeIO.fetch_project_packages" )
1126+ def test_product_portfolio_import_packages_from_scio_importer_duplicate_dependency (
1127+ self , mock_fetch_packages , mock_fetch_dependencies
1128+ ):
1129+ for_package_purl = "pkg:pypi/package@1.0"
1130+ for_package_uid = "6eb9d787-2f2a-40f3-8815-fbf8f6c373de"
1131+ resolved_to_package_purl = "pkg:pypi/dep@0.5"
1132+ resolved_to_package_uid = "895de5cb-2d40-4532-ae46-56104cd6a1bf"
1133+ mock_fetch_packages .return_value = [
1134+ {
1135+ "type" : "pypi" ,
1136+ "name" : "package" ,
1137+ "version" : "1.0" ,
1138+ "purl" : for_package_purl ,
1139+ "package_uid" : for_package_uid ,
1140+ },
1141+ {
1142+ "type" : "pypi" ,
1143+ "name" : "dep" ,
1144+ "version" : "0.5" ,
1145+ "purl" : resolved_to_package_purl ,
1146+ "package_uid" : resolved_to_package_uid ,
1147+ },
1148+ ]
1149+
1150+ dependency_uid = "12a4113b-99d2-455a-a96d-468ca29861d6"
1151+ mock_fetch_dependencies .return_value = [
1152+ {
1153+ "dependency_uid" : dependency_uid ,
1154+ "for_package_uid" : for_package_uid ,
1155+ "resolved_to_package_uid" : resolved_to_package_uid ,
1156+ }
1157+ ]
1158+
1159+ importer = ImportPackageFromScanCodeIO (
1160+ user = self .super_user ,
1161+ project_uuid = uuid .uuid4 (),
1162+ product = self .product1 ,
1163+ )
1164+ created , existing , errors = importer .save ()
1165+ expected = {
1166+ "package" : ["pkg:pypi/package@1.0" , "pkg:pypi/dep@0.5" ],
1167+ "dependency" : ["12a4113b-99d2-455a-a96d-468ca29861d6" ],
1168+ }
1169+ self .assertEqual (expected , created )
1170+ self .assertEqual ({}, existing )
1171+ self .assertEqual ({}, errors )
1172+ self .assertEqual (2 , self .product1 .packages .count ())
1173+ self .assertEqual (1 , self .product1 .dependencies .count ())
1174+
1175+ # Re-run the importer and make sure no duplicate entries are created
1176+ importer = ImportPackageFromScanCodeIO (
1177+ user = self .super_user ,
1178+ project_uuid = uuid .uuid4 (),
1179+ product = self .product1 ,
1180+ )
1181+ created , existing , errors = importer .save ()
1182+ self .assertEqual ({}, created )
1183+ self .assertEqual (expected , existing )
1184+ self .assertEqual ({}, errors )
1185+ self .assertEqual (2 , self .product1 .packages .count ())
1186+ self .assertEqual (1 , self .product1 .dependencies .count ())
1187+
1188+ # Change the dependency_uid to make sure the match happen on the FKs as well.
1189+ dependency_uid = "a46c682f-51a7-44a4-a00f-ccfc826befc6"
1190+ mock_fetch_dependencies .return_value = [
1191+ {
1192+ "dependency_uid" : dependency_uid ,
1193+ "for_package_uid" : for_package_uid ,
1194+ "resolved_to_package_uid" : resolved_to_package_uid ,
1195+ }
1196+ ]
1197+ importer = ImportPackageFromScanCodeIO (
1198+ user = self .super_user ,
1199+ project_uuid = uuid .uuid4 (),
1200+ product = self .product1 ,
1201+ )
1202+ created , existing , errors = importer .save ()
1203+ self .assertEqual ({}, created )
1204+ expected = {
1205+ "package" : ["pkg:pypi/package@1.0" , "pkg:pypi/dep@0.5" ],
1206+ "dependency" : ["a46c682f-51a7-44a4-a00f-ccfc826befc6" ],
1207+ }
1208+ self .assertEqual (expected , existing )
1209+ self .assertEqual ({}, errors )
1210+ self .assertEqual (2 , self .product1 .packages .count ())
1211+ self .assertEqual (1 , self .product1 .dependencies .count ())
0 commit comments