@@ -2628,7 +2628,7 @@ def test_package_model_get_purldb_entries(self, mock_find_packages):
26282628
26292629 mock_find_packages .return_value = [purldb_entry1 , purldb_entry2 , purldb_entry3 ]
26302630 purldb_entries = package1 .get_purldb_entries (user = self .user )
2631- # The purldb_entry2 is excluded as the PURL differs
2631+ # The purldb_entry3 is excluded as its plain PURL differs (no version)
26322632 self .assertEqual ([purldb_entry1 , purldb_entry2 ], purldb_entries )
26332633
26342634 @mock .patch ("dejacode_toolkit.purldb.PurlDB.find_packages" )
@@ -2645,6 +2645,42 @@ def test_package_model_get_purldb_entries_plain_purls_equal(self, mock_find_pack
26452645 purldb_entries = package1 .get_purldb_entries (user = self .user )
26462646 self .assertEqual ([purldb_entry1 , purldb_entry2 ], purldb_entries )
26472647
2648+ @mock .patch ("dejacode_toolkit.purldb.PurlDB.find_packages" )
2649+ def test_package_model_get_purldb_entries_fallback_to_purl (self , mock_find_packages ):
2650+ """
2651+ Test that get_purldb_entries falls through to PURL lookup when an earlier
2652+ strategy (e.g. download_url) returns no results.
2653+
2654+ This covers the Go package mapping bug (issue #462): packages imported from an
2655+ SBOM may have an inferred download_url that PurlDB does not recognise, while
2656+ their PURL *is* indexed in PurlDB. Without the fallback the PurlDB tab was
2657+ showing "No entries found" even though "Improve Packages from PurlDB" worked
2658+ (because that code path does not limit the number of requests).
2659+ """
2660+ go_purl = "pkg:golang/github.com/gin-gonic/gin@v1.9.0"
2661+ inferred_download_url = (
2662+ "https://proxy.golang.org/github.com/gin-gonic/gin/@v/v1.9.0.zip"
2663+ )
2664+ package1 = make_package (
2665+ self .dataspace ,
2666+ package_url = go_purl ,
2667+ download_url = inferred_download_url ,
2668+ )
2669+ purldb_entry = {
2670+ "purl" : go_purl ,
2671+ "type" : "golang" ,
2672+ "namespace" : "github.com/gin-gonic" ,
2673+ "name" : "gin" ,
2674+ "version" : "v1.9.0" ,
2675+ }
2676+
2677+ # Simulate: download_url lookup fails (None), PURL lookup succeeds.
2678+ mock_find_packages .side_effect = [None , [purldb_entry ]]
2679+ purldb_entries = package1 .get_purldb_entries (user = self .user )
2680+ self .assertEqual ([purldb_entry ], purldb_entries )
2681+ # Ensure both payloads were tried (download_url first, then purl).
2682+ self .assertEqual (2 , mock_find_packages .call_count )
2683+
26482684 @mock .patch ("component_catalog.models.Package.get_purldb_entries" )
26492685 def test_package_model_update_from_purldb (self , mock_get_purldb_entries ):
26502686 purldb_entry = {
0 commit comments