Skip to content

Commit

Permalink
tests: news: reduce boilerplate further
Browse files Browse the repository at this point in the history
Bug: https://bugs.gentoo.org/889330
Signed-off-by: Sam James <sam@gentoo.org>
  • Loading branch information
thesamesam committed Feb 18, 2023
1 parent 3f61943 commit 6635cb1
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 120 deletions.
2 changes: 1 addition & 1 deletion lib/portage/dbapi/virtual.py
@@ -1,4 +1,4 @@
# Copyright 1998-2020 Gentoo Authors
# Copyright 1998-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

from portage.dbapi import dbapi
Expand Down
173 changes: 54 additions & 119 deletions lib/portage/tests/news/test_NewsItem.py
Expand Up @@ -131,6 +131,25 @@ def _createNewsItem(self, *kwargs) -> FakeNewsItem:

return FakeNewsItem(**news_args)

def _checkAndCreateNewsItem(
self, news_args: dict, relevant: bool = True, reason: str = ""
) -> FakeNewsItem:
return self._checkNewsItem(self._createNewsItem(news_args), relevant, reason)

def _checkNewsItem(self, item: NewsItem, relevant: bool = True, reason: str = ""):
self.assertTrue(item.isValid())

if relevant:
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
)
else:
self.assertFalse(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be irrelevant, but it was relevant!",
)

def testNewsManager(self):
vardb = MagicMock()
portdb = MagicMock()
Expand All @@ -154,6 +173,8 @@ def testBasicNewsItem(self):
def testDisplayIfProfile(self):
# We repeat all of these with the full profile path (including repo)
# and a relative path, as we've had issues there before.
# Note that we can't use _checkNewsItem() here as we override the
# profile value passed to isRelevant.
for profile_prefix in ("", self.profile_base):
# First, just check the simple case of one profile matching ours.
item = self._createNewsItem(
Expand Down Expand Up @@ -217,183 +238,115 @@ def testDisplayIfProfile(self):
def testDisplayIfInstalled(self):
self.vardb.cpv_inject("sys-apps/portage-2.0", {"SLOT": "0"})

item = self._createNewsItem({"display_if_installed": ["sys-apps/portage"]})
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
)
self._checkAndCreateNewsItem({"display_if_installed": ["sys-apps/portage"]})

# Test the negative case: a single Display-If-Installed listing
# a package we don't have.
item = self._createNewsItem(
{"display_if_installed": ["sys-apps/i-do-not-exist"]}
)
self.assertTrue(item.isValid())
self.assertFalse(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be irrelevant, but it was relevant!",
self._checkAndCreateNewsItem(
{"display_if_installed": ["sys-apps/i-do-not-exist"]}, False
)

# What about several packages and we have none of them installed?
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_installed": [
"dev-util/pkgcheck",
"dev-util/pkgdev",
"sys-apps/pkgcore",
]
}
)
self.assertTrue(item.isValid())
self.assertFalse(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be irrelevant, but it was relevant!",
},
False,
)

# What about several packages and we have one of them installed?
self.vardb.cpv_inject("net-misc/openssh-9.2_p1", {"SLOT": "0"})
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_installed": [
"net-misc/openssh",
"net-misc/dropbear",
]
}
)
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
)

# What about several packages and we have all of them installed?
# Note: we already have openssh added from the above test
self.vardb.cpv_inject("net-misc/dropbear-2022.83", {"SLOT": "0"})
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_installed": [
"net-misc/openssh",
"net-misc/dropbear",
]
}
)
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
)

# What if we have a newer version of the listed package which
# shouldn't match the constraint?
self.vardb.cpv_inject("net-misc/openssh-9.2_p1", {"SLOT": "0"})
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_installed": [
"<net-misc/openssh-9.2_p1",
]
}
)
self.assertTrue(item.isValid())
self.assertFalse(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be irrelevant, but it was relevant!",
},
False,
)

# What if we have a newer version of the listed package which
# should match the constraint?
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_installed": [
">=net-misc/openssh-9.2_p1",
]
}
)
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
)

# What if the item lists multiple packages and we have one of
# them installed, but not all?
# (Note that openssh is already "installed" by this point because
# of a previous test.)
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_installed": [
">=net-misc/openssh-9.2_p1",
"<net-misc/openssh-9.2_p1",
]
}
)
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
)

def testDisplayIfKeyword(self):
item = self._createNewsItem({"display_if_keyword": [self.keywords]})
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
)
self._checkAndCreateNewsItem({"display_if_keyword": [self.keywords]})

# Test the negative case: a keyword we don't have set.
item = self._createNewsItem({"display_if_keyword": ["fake-keyword"]})
self.assertTrue(item.isValid())
self.assertFalse(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be irrelevant, but it was relevant!",
)
self._checkAndCreateNewsItem({"display_if_keyword": ["fake-keyword"]}, False)

# What if several keywords are listed and we match one of them?
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{"display_if_keyword": [self.keywords, "amd64", "~hppa"]}
)
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
)

# What if several keywords are listed and we match none of them?
item = self._createNewsItem({"display_if_keyword": ["amd64", "~hppa"]})
self.assertTrue(item.isValid())
self.assertFalse(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be irrelevant, but it was relevant!",
)
self._checkAndCreateNewsItem({"display_if_keyword": ["amd64", "~hppa"]}, False)

# What if the ~keyword (testing) keyword is listed but we're keyword (stable)?
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_keyword": [
f"~{self.keywords}",
]
}
)
self.assertTrue(item.isValid())
self.assertFalse(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be irrelevant, but it was relevant!",
},
False,
)

# What if the stable keyword is listed but we're ~keyword (testing)?
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_keyword": [
f"{self.keywords}",
]
}
)
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
)

def testMultipleRestrictions(self):
# GLEP 42 specifies an algorithm for how combining restrictions
Expand All @@ -403,62 +356,44 @@ def testMultipleRestrictions(self):
# What if there's a Display-If-Keyword that matches and a
# Display-If-Installed which does too?
self.vardb.cpv_inject("sys-apps/portage-2.0", {"SLOT": "0"})
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_keyword": [self.keywords],
"display_if_installed": ["sys-apps/portage"]
}
)
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
"display_if_installed": ["sys-apps/portage"],
}
)

# What if there's a Display-If-Keyword that matches and a
# Display-If-Installed which doesn't?
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_keyword": [self.keywords],
"display_if_installed": ["sys-apps/i-do-not-exist"]
}
)
self.assertTrue(item.isValid())
self.assertFalse(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be irrelevant, but it was relevant!",
"display_if_installed": ["sys-apps/i-do-not-exist"],
},
False,
)

# What if there's a Display-If-{Installed,Keyword,Profile} and
# they all match?
# (Note that sys-apps/portage is already "installed" by this point
# because of the above test.)
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_keyword": [self.keywords],
"display_if_installed": ["sys-apps/portage"],
"display_if_profile": [self.profile],
}
)
self.assertTrue(item.isValid())
self.assertTrue(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be relevant, but it was not!",
}
)

# What if there's a Display-If-{Installed,Keyword,Profile} and
# none of them match?
# (Note that sys-apps/portage is already "installed" by this point
# because of the above test.)
item = self._createNewsItem(
self._checkAndCreateNewsItem(
{
"display_if_keyword": ["i-do-not-exist"],
"display_if_installed": ["sys-apps/i-do-not-exist"],
"display_if_profile": [self.profile_base + "/i-do-not-exist"],
}
)
self.assertTrue(item.isValid())
self.assertFalse(
item.isRelevant(self.vardb, self.settings, self.profile),
msg=f"Expected {item} to be irrelevant, but it was relevant!",
},
False,
)

0 comments on commit 6635cb1

Please sign in to comment.