jenkins-bot has submitted this change and it was merged.
Change subject: Sysop and user tests ......................................................................
Sysop and user tests
Some tests require a user or sysop, but are not yet flagged as user=True.
This changeset also adds a sysop flag, to identify tests which require a sysop account, skipping the test if this condition is not met.
All tests except pwb.py-based tests can now be run without user-config.py, with tests skipping if they require a username.
Change-Id: I690423556f1266f3ebe0bee11aa91b41b9965baf --- M tests/aspects.py M tests/page_tests.py M tests/script_tests.py M tests/site_tests.py 4 files changed, 100 insertions(+), 53 deletions(-)
Approvals: John Vandenberg: Looks good to me, but someone else must approve XZise: Looks good to me, approved jenkins-bot: Verified
diff --git a/tests/aspects.py b/tests/aspects.py index 0f3b9f1..3089fc3 100644 --- a/tests/aspects.py +++ b/tests/aspects.py @@ -204,12 +204,14 @@ user = True
@classmethod - def require_site_user(cls): + def require_site_user(cls, family, code, sysop=False): """Check the user config has a valid login to the site.""" - if not cls.has_site_user(cls.family, cls.code): + if not cls.has_site_user(family, code, sysop=sysop): raise unittest.SkipTest( - '%s: No username for %s:%s' - % (cls.__name__, cls.family, cls.code)) + '%s: No %susername for %s:%s' + % (cls.__name__, + "sysop " if sysop else "", + family, code))
@classmethod def setUpClass(cls): @@ -221,14 +223,19 @@ """ super(RequireUserMixin, cls).setUpClass()
- cls.require_site_user() + sysop = hasattr(cls, 'sysop') and cls.sysop
- cls.site.login() + for site in cls.sites.values(): + cls.require_site_user(site['family'], site['code'], sysop)
- if not cls.site.user(): - raise unittest.SkipTest( - '%s: Unable able to login to %s' - % cls.__name__, cls.site) + site['site'].login(sysop) + + if not site['site'].user(): + raise unittest.SkipTest( + '%s: Unable able to login to %s as %s' + % (cls.__name__, + 'sysop' if sysop else 'bot', + site['site']))
def setUp(self): """ @@ -237,9 +244,17 @@ Login to the site if it is not logged in. """ super(RequireUserMixin, self).setUp() - site = self.get_site() - if not site.logged_in(): - site.login() + + sysop = hasattr(self, 'sysop') and self.sysop + + # There may be many sites, and setUp doesnt know + # which site is to be tested; ensure they are all + # logged in. + for site in self.sites.values(): + site = site['site'] + + if not site.logged_in(sysop): + site.login(sysop)
class MetaTestCaseClass(type): @@ -351,7 +366,7 @@ if 'write' in dct and dct['write']: bases = tuple([SiteWriteMixin] + list(bases))
- if 'user' in dct and dct['user']: + if ('user' in dct and dct['user']) or ('sysop' in dct and dct['sysop']): bases = tuple([RequireUserMixin] + list(bases))
for test in tests: @@ -449,15 +464,17 @@ return cls.sites[name]['site']
@classmethod - def has_site_user(cls, family, code): + def has_site_user(cls, family, code, sysop=False): """Check the user config has a user for the site.""" if not family: raise Exception('no family defined for %s' % cls.__name__) if not code: raise Exception('no site code defined for %s' % cls.__name__)
- return code in config.usernames[family] or \ - '*' in config.usernames[family] + usernames = config.sysopnames if sysop else config.usernames + + return code in usernames[family] or \ + '*' in usernames[family]
def __init__(self, *args, **kwargs): """Constructor.""" @@ -666,6 +683,11 @@
pwb = True spawn = True + # pywikibot.handleArgs currently instantiates a Site object + # and tries to fetch the users messages. + site = True + net = True + user = True
class DeprecationTestCase(TestCase): diff --git a/tests/page_tests.py b/tests/page_tests.py index 3169d1e..98616e5 100644 --- a/tests/page_tests.py +++ b/tests/page_tests.py @@ -409,7 +409,6 @@ self.assertIsInstance(mainpage.editTime(), pywikibot.Timestamp) self.assertIsInstance(mainpage.previousRevision(), int) self.assertIsInstance(mainpage.permalink(), basestring) - self.assertIsInstance(mainpage.purge(), bool)
def testIsDisambig(self): """Test the integration with Extension:Disambiguator.""" @@ -579,6 +578,18 @@ self.assertFalse(cat_not_hidden.isHiddenCategory())
+class TestPageUserAction(DefaultSiteTestCase): + + """Test page user actions.""" + + cached = True + user = True + + def test_purge(self): + mainpage = self.get_mainpage() + self.assertIsInstance(mainpage.purge(), bool) + + if __name__ == '__main__': try: unittest.main() diff --git a/tests/script_tests.py b/tests/script_tests.py index 5763c37..0cb3958 100644 --- a/tests/script_tests.py +++ b/tests/script_tests.py @@ -415,6 +415,7 @@ site = True
def setUp(self): + super(TestScript, self).setUp() """Prepare the environment for running the pwb.py script.""" self.old_pywikibot_dir = None if 'PYWIKIBOT2_DIR' in os.environ: @@ -423,6 +424,7 @@
def tearDown(self): """Restore the environment after running the pwb.py script.""" + super(TestScript, self).tearDown() del os.environ['PYWIKIBOT2_DIR'] if self.old_pywikibot_dir: os.environ['PYWIKIBOT2_DIR'] = self.old_pywikibot_dir diff --git a/tests/site_tests.py b/tests/site_tests.py index 6c600c7..1e35899 100644 --- a/tests/site_tests.py +++ b/tests/site_tests.py @@ -144,11 +144,6 @@ self.assertFalse(mysite.isInterwikiLink("foo")) self.assertIsInstance(mysite.redirectRegex().pattern, basestring) self.assertIsInstance(mysite.category_on_one_line(), bool) - for grp in ("user", "autoconfirmed", "bot", "sysop", "nosuchgroup"): - self.assertIsInstance(mysite.has_group(grp), bool) - for rgt in ("read", "edit", "move", "delete", "rollback", "block", - "nosuchright"): - self.assertIsInstance(mysite.has_right(rgt), bool)
def testConstructors(self): """Test cases for site constructors.""" @@ -223,21 +218,6 @@ self.assertIsInstance(mysite.logged_in(), bool) self.assertIsInstance(mysite.logged_in(True), bool) self.assertIsInstance(mysite.userinfo, dict) - self.assertIsInstance(mysite.is_blocked(), bool) - self.assertIsInstance(mysite.messages(), bool) - self.assertIsInstance(mysite.has_right("edit"), bool) - self.assertFalse(mysite.has_right("nonexistent_right")) - self.assertIsInstance(mysite.has_group("bots"), bool) - self.assertFalse(mysite.has_group("nonexistent_group")) - try: - self.assertIsInstance(mysite.is_blocked(True), bool) - self.assertIsInstance(mysite.has_right("edit", True), bool) - self.assertFalse(mysite.has_right("nonexistent_right", True)) - self.assertIsInstance(mysite.has_group("bots", True), bool) - self.assertFalse(mysite.has_group("nonexistent_group", True)) - except pywikibot.NoUsername: - pywikibot.warning( - "Cannot test Site methods for sysop; no sysop account configured.")
for msg in ("1movedto2", "about", "aboutpage", "aboutsite", "accesskey-n-portal"): @@ -619,9 +599,9 @@ self.assertRaises(pywikibot.Error, mysite.blocks, starttime="2008-08-03T23:59:59Z", endtime="2008-08-03T00:00:01Z", reverse=True, total=5) - for block in mysite.blocks(users=mysite.user(), total=5): + for block in mysite.blocks(users='80.100.22.71', total=5): self.assertIsInstance(block, dict) - self.assertEqual(block['user'], mysite.user()) + self.assertEqual(block['user'], '80.100.22.71')
def testExturlusage(self): """Test the site.exturlusage() method.""" @@ -712,6 +692,20 @@ """Test site method using a user."""
user = True + + def test_methods(self): + mysite = self.get_site() + self.assertIsInstance(mysite.is_blocked(), bool) + self.assertIsInstance(mysite.messages(), bool) + self.assertIsInstance(mysite.has_right("edit"), bool) + self.assertFalse(mysite.has_right("nonexistent_right")) + self.assertIsInstance(mysite.has_group("bots"), bool) + self.assertFalse(mysite.has_group("nonexistent_group")) + for grp in ("user", "autoconfirmed", "bot", "sysop", "nosuchgroup"): + self.assertIsInstance(mysite.has_group(grp), bool) + for rgt in ("read", "edit", "move", "delete", "rollback", "block", + "nosuchright"): + self.assertIsInstance(mysite.has_right(rgt), bool)
def testLogEvents(self): """Test the site.logevents() method.""" @@ -1028,17 +1022,25 @@ for rev in mysite.watchlist_revs(showAnon=False, total=5): self.assertIsInstance(rev, dict)
+ +class SiteSysopTestCase(DefaultSiteTestCase): + + """Test site method using a sysop account.""" + + sysop = True + + def test_methods(self): + mysite = self.get_site() + self.assertIsInstance(mysite.is_blocked(True), bool) + self.assertIsInstance(mysite.has_right("edit", True), bool) + self.assertFalse(mysite.has_right("nonexistent_right", True)) + self.assertIsInstance(mysite.has_group("bots", True), bool) + self.assertFalse(mysite.has_group("nonexistent_group", True)) + def testDeletedrevs(self): """Test the site.deletedrevs() method.""" mysite = self.get_site() mainpage = self.get_mainpage() - if not mysite.logged_in(True): - try: - mysite.login(True) - except pywikibot.NoUsername: - pywikibot.warning( - "Cannot test Site.deleted_revs; no sysop account configured.") - return gen = mysite.deletedrevs(total=10, page=mainpage) for dr in gen: break @@ -1095,6 +1097,13 @@ page=mainpage, start="2008-09-03T23:59:59Z", end="2008-09-03T00:00:01Z", reverse=True, total=5) + + +class SiteUserTestCase2(DefaultSiteTestCase): + + """More tests that rely on a user account.""" + + user = True
def testUsers(self): """Test the site.users() method.""" @@ -1503,20 +1512,23 @@ 'wikidatatest': { 'family': 'wikidata', 'code': 'test', + 'enabled': False, }, 'wikipediatest': { 'family': 'wikipedia', 'code': 'test', + 'enabled': True, } }
- def test_is_uploaddisabled_wp(self): - site = self.get_site('wikipediatest') - self.assertFalse(site.is_uploaddisabled()) + user = True
- def test_is_uploaddisabled_wd(self): - site = self.get_site('wikidatatest') - self.assertTrue(site.is_uploaddisabled()) + def test_is_uploaddisabled(self, key): + site = self.get_site(key) + if self.sites[key]['enabled']: + self.assertFalse(site.is_uploaddisabled()) + else: + self.assertTrue(site.is_uploaddisabled())
class TestDataSitePreloading(WikidataTestCase):
pywikibot-commits@lists.wikimedia.org