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']
Attachment:
signature.asc
Description: PGP signature