@@ -698,6 +698,46 @@ def test_normalize_version_range() -> None:
698698 assert checker .normalize_version_range (">= 1.0.0, < 2.0.0" ) == ">= 1.0.0, < 2.0.0"
699699
700700
701+ def test_get_installed_bundle_packages_traverses_duplicate_parent_subtrees () -> None :
702+ with tempfile .TemporaryDirectory () as temp_dir :
703+ package_dir = Path (temp_dir ) / "deps" / "npm"
704+ write_package_json (
705+ package_dir / "package.json" ,
706+ {
707+ "name" : "npm" ,
708+ "version" : "11.18.0" ,
709+ "bundleDependencies" : ["make-fetch-happen" , "wrapper" ],
710+ },
711+ )
712+
713+ checker = NPMAuditChecker (Path (temp_dir ), timeout = 60 )
714+ packages = checker .get_installed_bundle_packages (
715+ package_dir ,
716+ {
717+ "dependencies" : {
718+ "wrapper" : {
719+ "version" : "1.0.0" ,
720+ "dependencies" : {
721+ "make-fetch-happen" : {
722+ "version" : "15.0.6"
723+ }
724+ },
725+ },
726+ "make-fetch-happen" : {
727+ "version" : "15.0.6" ,
728+ "dependencies" : {
729+ "ip-address" : {"version" : "10.2.0" }
730+ },
731+ },
732+ }
733+ },
734+ )
735+ package_map = {pkg ["name" ]: pkg for pkg in packages }
736+
737+ assert package_map ["make-fetch-happen" ]["path" ] == "node_modules/wrapper/node_modules/make-fetch-happen"
738+ assert package_map ["ip-address" ]["path" ] == "node_modules/make-fetch-happen/node_modules/ip-address"
739+
740+
701741def test_get_installed_bundle_packages_accepts_boolean_bundle_dependencies () -> None :
702742 with tempfile .TemporaryDirectory () as temp_dir :
703743 package_dir = Path (temp_dir ) / "deps" / "npm"
@@ -808,6 +848,7 @@ def test_npm_audit_basic() -> None:
808848 test_parse_audit_results_normalizes_ids ()
809849 test_preferred_advisory_id ()
810850 test_normalize_version_range ()
851+ test_get_installed_bundle_packages_traverses_duplicate_parent_subtrees ()
811852 test_get_installed_bundle_packages_accepts_boolean_bundle_dependencies ()
812853 test_npm_cli_uses_installed_tree ()
813854
0 commit comments