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 <[email protected]>
Gerrit-Reviewer: John Vandenberg <[email protected]>
Gerrit-Reviewer: Ladsgroup <[email protected]>
Gerrit-Reviewer: Merlijn van Deen <[email protected]>
Gerrit-Reviewer: XZise <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to