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):
--
To view, visit
https://gerrit.wikimedia.org/r/168958
To unsubscribe, visit
https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I690423556f1266f3ebe0bee11aa91b41b9965baf
Gerrit-PatchSet: 3
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: John Vandenberg <jayvdb(a)gmail.com>
Gerrit-Reviewer: Ladsgroup <ladsgroup(a)gmail.com>
Gerrit-Reviewer: Merlijn van Deen <valhallasw(a)arctus.nl>
Gerrit-Reviewer: XZise <CommodoreFabianus(a)gmx.de>
Gerrit-Reviewer: jenkins-bot <>