Hey, Here is a new patch including unit tests.
Feel free to review and comment! -- PEB
diff --git a/distro_tracker/core/models.py b/distro_tracker/core/models.py index bcbb37a..d55dcb8 100644 --- a/distro_tracker/core/models.py +++ b/distro_tracker/core/models.py @@ -503,14 +503,34 @@ def get_web_package(package_name): :param package_name: The name for which a package should be found. :type package_name: string """ - if SourcePackageName.objects.exists_with_name(package_name): + + ( + package_name, + [ + search_source, + search_pseudo, + search_binary, + search_pname, + ], + ) = __package_search_helper(package_name) + + if ( + search_source and + SourcePackageName.objects.exists_with_name(package_name) + ): return SourcePackageName.objects.get(name=package_name) - elif PseudoPackageName.objects.exists_with_name(package_name): + elif ( + search_pseudo and + PseudoPackageName.objects.exists_with_name(package_name) + ): return PseudoPackageName.objects.get(name=package_name) - elif BinaryPackageName.objects.exists_with_name(package_name): + elif ( + search_binary and + BinaryPackageName.objects.exists_with_name(package_name) + ): binary_package = BinaryPackageName.objects.get(name=package_name) return binary_package.main_source_package_name - elif PackageName.objects.exists_with_name(package_name): + elif search_pname and PackageName.objects.exists_with_name(package_name): pkg = PackageName.objects.get(name=package_name) # This is not a current source or binary package, but if it has # associated news, then it's likely a former source package where we can @@ -521,6 +541,43 @@ def get_web_package(package_name): return None +def __package_search_helper(package_name): + """ + Utility function that helps to decide where the tracker should search + for `package_name`. If package_name starts with 'src:' or 'bin:', + then narrows the search to the specific representations. If not, + then searches everywhere. Returns a tuple with the stripped package + name and a list of places to search. + + :rtype: `tuple` + + :param package_name: The name for which a package should be found. + :type package_name: string + """ + + search_source = True + search_pseudo = True + search_binary = True + search_pname = True + + if package_name.startswith("src:"): + package_name = package_name.replace("src:", "") + search_pseudo = search_binary = False + if package_name.startswith("bin:"): + package_name = package_name.replace("bin:", "") + search_source = search_pseudo = search_pname = False + + return ( + package_name, + [ + search_source, + search_pseudo, + search_binary, + search_pname, + ] + ) + + class SubscriptionManager(models.Manager): """ A custom :class:`Manager <django.db.models.Manager>` for the diff --git a/distro_tracker/core/tests/tests_models.py b/distro_tracker/core/tests/tests_models.py index 1216528..2c62e7a 100644 --- a/distro_tracker/core/tests/tests_models.py +++ b/distro_tracker/core/tests/tests_models.py @@ -42,6 +42,7 @@ from distro_tracker.core.models import MailingList from distro_tracker.core.models import Team from distro_tracker.core.models import TeamMembership from distro_tracker.core.models import MembershipPackageSpecifics +from distro_tracker.core.models import get_web_package from distro_tracker.core.utils import message_from_bytes from distro_tracker.core.utils.email_messages import get_decoded_message_payload from distro_tracker.accounts.models import User, UserEmail @@ -1227,6 +1228,83 @@ class SourcePackageTests(TestCase): changelog_entry) +class WebFunctionsPackageTests(TestCase): + """A class that tests web functions of models.py""" + + def setUp(self): + self.source_package_name = \ + SourcePackageName.objects.create(name='dummy-package') + self.source_package = SourcePackage.objects.create( + source_package_name=self.source_package_name, version='1.0.0') + self.binary_package = BinaryPackageName.objects.create( + name='binary-package') + self.source_package.binary_packages.add(self.binary_package) + + def test_get_source_package_without_tag(self): + """Test retrieving self.source_package from the list. + + """ + + package = get_web_package("dummy-package") + + self.assertEqual( + self.source_package_name, + package, + ) + + def test_get_source_package_with_tag(self): + """Test retrieving self.source_package from the list + with a src:tag. + + """ + + package = get_web_package("src:dummy-package") + + self.assertEqual( + self.source_package_name, + package, + ) + + def fail_test_get_source_package_with_bin_tag(self): + """Test retrieving self.source_package from the list + via a binary search with the wrong name. + + """ + + package = get_web_package("bin:dummy-package") + + self.assertEqual( + package, + None, + ) + + def test_get_source_package_with_bin_tag(self): + """Test retrieving self.source_package from the list + via a binary search with the good name. + + """ + + package = get_web_package("bin:binary-package") + + self.assertEqual( + self.source_package_name, + package, + ) + + def test_get_source_package_from_bin_without_tag(self): + """Test retrieving self.source_package from the list + via a binary search with the good name. + + """ + + package = get_web_package("binary-package") + + self.assertEqual( + self.source_package_name, + package, + ) + + class BinaryPackageTests(TestCase): fixtures = ['repository-test-fixture.json']
signature.asc
Description: PGP signature