Maverick has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/181883

Change subject: Skip Token tests if user doesn't have rights
......................................................................

Skip Token tests if user doesn't have rights

Following tests will be skipped if user doesn't have rights:
site_tests.TestSiteTokens.*
site_tests.TestSiteObjectDeprecatedFunctions.test_token
site_tests.SiteUserTestCase2.testPatrol

Bug: T85353
Change-Id: I2bb23452880ce624c382bf7b5b8929a64f7e5fb7
---
M tests/site_tests.py
1 file changed, 177 insertions(+), 46 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core 
refs/changes/83/181883/1

diff --git a/tests/site_tests.py b/tests/site_tests.py
index 60bb7bb..52789d1 100644
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -16,7 +16,7 @@
 
 import pywikibot
 from pywikibot import config
-from pywikibot.tools import MediaWikiVersion as LV
+from pywikibot.tools import MediaWikiVersion
 from pywikibot.data import api
 
 from tests.aspects import (
@@ -53,6 +53,10 @@
         mysite = self.get_site()
         mainpage = self.get_mainpage()
         ttype = "edit"
+        if ttype not in mysite.tokens:
+            raise unittest.SkipTest(
+                "Action '%s' not allowed for user %s on wiki %s"
+                % (ttype, mysite.user(), mysite))
         try:
             token = mysite.tokens[ttype]
         except KeyError:
@@ -152,7 +156,7 @@
         # first-letter (== only first non-namespace letter is case insensitive)
         # See also: https://www.mediawiki.org/wiki/Manual:$wgCapitalLinks
         self.assertTrue(mysite.sametitle("Special:Always", "Special:always"))
-        if LV(mysite.version()) >= LV('1.16'):
+        if MediaWikiVersion(mysite.version()) >= MediaWikiVersion('1.16'):
             self.assertTrue(mysite.sametitle('User:Always', 'User:always'))
             self.assertTrue(mysite.sametitle('MediaWiki:Always', 
'MediaWiki:always'))
 
@@ -607,34 +611,34 @@
         for t in range(1, len(timestamps)):
             self.assertGreaterEqual(timestamps[t], timestamps[t - 1])
 
-        for block in mysite.blocks(starttime="2008-07-01T00:00:01Z", total=5):
+        for block in 
mysite.blocks(starttime=pywikibot.Timestamp.fromISOformat("2008-07-01T00:00:01Z"),
 total=5):
             self.assertIsInstance(block, dict)
             for prop in props:
                 self.assertIn(prop, block)
-        for block in mysite.blocks(endtime="2008-07-31T23:59:59Z", total=5):
+        for block in 
mysite.blocks(endtime=pywikibot.Timestamp.fromISOformat("2008-07-31T23:59:59Z"),
 total=5):
             self.assertIsInstance(block, dict)
             for prop in props:
                 self.assertIn(prop, block)
-        for block in mysite.blocks(starttime="2008-08-02T00:00:01Z",
-                                   endtime="2008-08-02T23:59:59Z",
+        for block in 
mysite.blocks(starttime=pywikibot.Timestamp.fromISOformat("2008-08-02T00:00:01Z"),
+                                   
endtime=pywikibot.Timestamp.fromISOformat("2008-08-02T23:59:59Z"),
                                    reverse=True, total=5):
             self.assertIsInstance(block, dict)
             for prop in props:
                 self.assertIn(prop, block)
-        for block in mysite.blocks(starttime="2008-08-03T23:59:59Z",
-                                   endtime="2008-08-03T00:00:01Z",
+        for block in 
mysite.blocks(starttime=pywikibot.Timestamp.fromISOformat("2008-08-03T23:59:59Z"),
+                                   
endtime=pywikibot.Timestamp.fromISOformat("2008-08-03T00:00:01Z"),
                                    total=5):
             self.assertIsInstance(block, dict)
             for prop in props:
                 self.assertIn(prop, block)
         # starttime earlier than endtime
         self.assertRaises(pywikibot.Error, mysite.blocks,
-                          starttime="2008-08-03T00:00:01Z",
-                          endtime="2008-08-03T23:59:59Z", total=5)
+                          
starttime=pywikibot.Timestamp.fromISOformat("2008-08-03T00:00:01Z"),
+                          
endtime=pywikibot.Timestamp.fromISOformat("2008-08-03T23:59:59Z"), total=5)
         # reverse: endtime earlier than starttime
         self.assertRaises(pywikibot.Error, mysite.blocks,
-                          starttime="2008-08-03T23:59:59Z",
-                          endtime="2008-08-03T00:00:01Z", reverse=True, 
total=5)
+                          
starttime=pywikibot.Timestamp.fromISOformat("2008-08-03T23:59:59Z"),
+                          
endtime=pywikibot.Timestamp.fromISOformat("2008-08-03T00:00:01Z"), 
reverse=True, total=5)
         for block in mysite.blocks(users='80.100.22.71', total=5):
             self.assertIsInstance(block, dict)
             self.assertEqual(block['user'], '80.100.22.71')
@@ -650,6 +654,18 @@
         for link in mysite.exturlusage(url, namespaces=[2, 3], total=5):
             self.assertIsInstance(link, pywikibot.Page)
             self.assertIn(link.namespace(), (2, 3))
+
+    def test_lock_page(self):
+        """Test the site.lock_page() and site.unlock_page() method."""
+        site = self.get_site()
+        p1 = pywikibot.Page(site, u'Foo')
+
+        site.lock_page(page=p1, block=True)
+        self.assertRaises(pywikibot.site.PageInUse, site.lock_page, page=p1, 
block=False)
+        site.unlock_page(page=p1)
+        # verify it's unlocked
+        site.lock_page(page=p1, block=False)
+        site.unlock_page(page=p1)
 
 
 class TestImageUsage(DefaultSiteTestCase):
@@ -762,32 +778,32 @@
             self.assertEqual(entry.title().title(), mainpage.title())
         for entry in mysite.logevents(user=mysite.user(), total=3):
             self.assertEqual(entry.user(), mysite.user())
-        for entry in mysite.logevents(start="2008-09-01T00:00:01Z", total=5):
+        for entry in 
mysite.logevents(start=pywikibot.Timestamp.fromISOformat("2008-09-01T00:00:01Z"),
 total=5):
             self.assertIsInstance(entry, pywikibot.logentries.LogEntry)
             self.assertLessEqual(str(entry.timestamp()), 
"2008-09-01T00:00:01Z")
-        for entry in mysite.logevents(end="2008-09-02T23:59:59Z", total=5):
+        for entry in 
mysite.logevents(end=pywikibot.Timestamp.fromISOformat("2008-09-02T23:59:59Z"), 
total=5):
             self.assertIsInstance(entry, pywikibot.logentries.LogEntry)
             self.assertGreaterEqual(str(entry.timestamp()), 
"2008-09-02T23:59:59Z")
-        for entry in mysite.logevents(start="2008-02-02T00:00:01Z",
-                                      end="2008-02-02T23:59:59Z",
+        for entry in 
mysite.logevents(start=pywikibot.Timestamp.fromISOformat("2008-02-02T00:00:01Z"),
+                                      
end=pywikibot.Timestamp.fromISOformat("2008-02-02T23:59:59Z"),
                                       reverse=True, total=5):
             self.assertIsInstance(entry, pywikibot.logentries.LogEntry)
             self.assertTrue(
                 "2008-02-02T00:00:01Z" <= str(entry.timestamp()) <= 
"2008-02-02T23:59:59Z")
-        for entry in mysite.logevents(start="2008-02-03T23:59:59Z",
-                                      end="2008-02-03T00:00:01Z",
+        for entry in 
mysite.logevents(start=pywikibot.Timestamp.fromISOformat("2008-02-03T23:59:59Z"),
+                                      
end=pywikibot.Timestamp.fromISOformat("2008-02-03T00:00:01Z"),
                                       total=5):
             self.assertIsInstance(entry, pywikibot.logentries.LogEntry)
             self.assertTrue(
                 "2008-02-03T00:00:01Z" <= str(entry.timestamp()) <= 
"2008-02-03T23:59:59Z")
         # starttime earlier than endtime
         self.assertRaises(pywikibot.Error, mysite.logevents,
-                          start="2008-02-03T00:00:01Z",
-                          end="2008-02-03T23:59:59Z", total=5)
+                          
start=pywikibot.Timestamp.fromISOformat("2008-02-03T00:00:01Z"),
+                          
end=pywikibot.Timestamp.fromISOformat("2008-02-03T23:59:59Z"), total=5)
         # reverse: endtime earlier than starttime
         self.assertRaises(pywikibot.Error, mysite.logevents,
-                          start="2008-02-03T23:59:59Z",
-                          end="2008-02-03T00:00:01Z", reverse=True, total=5)
+                          
start=pywikibot.Timestamp.fromISOformat("2008-02-03T23:59:59Z"),
+                          
end=pywikibot.Timestamp.fromISOformat("2008-02-03T00:00:01Z"), reverse=True, 
total=5)
 
     def testRecentchanges(self):
         """Test the site.recentchanges() method."""
@@ -803,30 +819,30 @@
         self.assertLessEqual(len(rc), 10)
         self.assertTrue(all(isinstance(change, dict)
                             for change in rc))
-        for change in mysite.recentchanges(start="2008-10-01T01:02:03Z",
+        for change in 
mysite.recentchanges(start=pywikibot.Timestamp.fromISOformat("2008-10-01T01:02:03Z"),
                                            total=5):
             self.assertIsInstance(change, dict)
             self.assertLessEqual(change['timestamp'], "2008-10-01T01:02:03Z")
-        for change in mysite.recentchanges(end="2008-04-01T02:03:04Z",
+        for change in 
mysite.recentchanges(end=pywikibot.Timestamp.fromISOformat("2008-04-01T02:03:04Z"),
                                            total=5):
             self.assertIsInstance(change, dict)
             self.assertGreaterEqual(change['timestamp'], 
"2008-10-01T02:03:04Z")
-        for change in mysite.recentchanges(start="2008-10-01T03:05:07Z",
+        for change in 
mysite.recentchanges(start=pywikibot.Timestamp.fromISOformat("2008-10-01T03:05:07Z"),
                                            total=5, reverse=True):
             self.assertIsInstance(change, dict)
             self.assertGreaterEqual(change['timestamp'], 
"2008-10-01T03:05:07Z")
-        for change in mysite.recentchanges(end="2008-10-01T04:06:08Z",
+        for change in 
mysite.recentchanges(end=pywikibot.Timestamp.fromISOformat("2008-10-01T04:06:08Z"),
                                            total=5, reverse=True):
             self.assertIsInstance(change, dict)
             self.assertLessEqual(change['timestamp'], "2008-10-01T04:06:08Z")
-        for change in mysite.recentchanges(start="2008-10-03T11:59:59Z",
-                                           end="2008-10-03T00:00:01Z",
+        for change in 
mysite.recentchanges(start=pywikibot.Timestamp.fromISOformat("2008-10-03T11:59:59Z"),
+                                           
end=pywikibot.Timestamp.fromISOformat("2008-10-03T00:00:01Z"),
                                            total=5):
             self.assertIsInstance(change, dict)
             self.assertTrue(
                 "2008-10-03T00:00:01Z" <= change['timestamp'] <= 
"2008-10-03T11:59:59Z")
-        for change in mysite.recentchanges(start="2008-10-05T06:00:01Z",
-                                           end="2008-10-05T23:59:59Z",
+        for change in 
mysite.recentchanges(start=pywikibot.Timestamp.fromISOformat("2008-10-05T06:00:01Z"),
+                                           
end=pywikibot.Timestamp.fromISOformat("2008-10-05T23:59:59Z"),
                                            reverse=True, total=5):
             self.assertIsInstance(change, dict)
             self.assertTrue(
@@ -837,8 +853,8 @@
                           end="2008-02-03T23:59:59Z", total=5)
         # reverse: end earlier than start
         self.assertRaises(pywikibot.Error, mysite.recentchanges,
-                          start="2008-02-03T23:59:59Z",
-                          end="2008-02-03T00:00:01Z", reverse=True, total=5)
+                          
start=pywikibot.Timestamp.fromISOformat("2008-02-03T23:59:59Z"),
+                          
end=pywikibot.Timestamp.fromISOformat("2008-02-03T00:00:01Z"), reverse=True, 
total=5)
         for change in mysite.recentchanges(namespaces=[6, 7], total=5):
             self.assertIsInstance(change, dict)
             self.assertTrue("title" in change and "ns" in change)
@@ -847,7 +863,7 @@
             prefix = title[:title.index(":")]
             self.assertIn(mysite.ns_index(prefix), [6, 7])
             self.assertIn(change["ns"], [6, 7])
-        if LV(mysite.version()) <= LV("1.14"):
+        if MediaWikiVersion(mysite.version()) <= MediaWikiVersion("1.14"):
             pagelist = [mainpage]
             if imagepage:
                 pagelist += [imagepage]
@@ -936,30 +952,30 @@
                 self.assertIn(key, contrib)
             self.assertTrue(contrib["user"].startswith("John"))
         for contrib in mysite.usercontribs(userprefix="Jane",
-                                           start="2008-10-06T01:02:03Z",
+                                           
start=pywikibot.Timestamp.fromISOformat("2008-10-06T01:02:03Z"),
                                            total=5):
             self.assertLessEqual(contrib['timestamp'], "2008-10-06T01:02:03Z")
         for contrib in mysite.usercontribs(userprefix="Jane",
-                                           end="2008-10-07T02:03:04Z",
+                                           
end=pywikibot.Timestamp.fromISOformat("2008-10-07T02:03:04Z"),
                                            total=5):
             self.assertGreaterEqual(contrib['timestamp'], 
"2008-10-07T02:03:04Z")
         for contrib in mysite.usercontribs(userprefix="Brion",
-                                           start="2008-10-08T03:05:07Z",
+                                           
start=pywikibot.Timestamp.fromISOformat("2008-10-08T03:05:07Z"),
                                            total=5, reverse=True):
             self.assertGreaterEqual(contrib['timestamp'], 
"2008-10-08T03:05:07Z")
         for contrib in mysite.usercontribs(userprefix="Brion",
-                                           end="2008-10-09T04:06:08Z",
+                                           
end=pywikibot.Timestamp.fromISOformat("2008-10-09T04:06:08Z"),
                                            total=5, reverse=True):
             self.assertLessEqual(contrib['timestamp'], "2008-10-09T04:06:08Z")
         for contrib in mysite.usercontribs(userprefix="Tim",
-                                           start="2008-10-10T11:59:59Z",
-                                           end="2008-10-10T00:00:01Z",
+                                           
start=pywikibot.Timestamp.fromISOformat("2008-10-10T11:59:59Z"),
+                                           
end=pywikibot.Timestamp.fromISOformat("2008-10-10T00:00:01Z"),
                                            total=5):
             self.assertTrue(
                 "2008-10-10T00:00:01Z" <= contrib['timestamp'] <= 
"2008-10-10T11:59:59Z")
         for contrib in mysite.usercontribs(userprefix="Tim",
-                                           start="2008-10-11T06:00:01Z",
-                                           end="2008-10-11T23:59:59Z",
+                                           
start=pywikibot.Timestamp.fromISOformat("2008-10-11T06:00:01Z"),
+                                           
end=pywikibot.Timestamp.fromISOformat("2008-10-11T23:59:59Z"),
                                            reverse=True, total=5):
             self.assertTrue(
                 "2008-10-11T06:00:01Z" <= contrib['timestamp'] <= 
"2008-10-11T23:59:59Z")
@@ -1138,6 +1154,112 @@
                           total=5)
 
 
+class TestSiteSysopWrite(TestCase):
+
+    """Test site sysop methods that require writing."""
+
+    family = 'test'
+    code = 'test'
+
+    write = True
+    sysop = True
+
+    @unittest.expectedFailure
+    def test_protect(self):
+        """Test the site.protect() method."""
+        site = self.get_site()
+        p1 = pywikibot.Page(site, u'User:Unicodesnowman/ProtectTest')
+
+        r = site.protect(protections={'edit': 'sysop', 'move': 
'autoconfirmed'},
+                         page=p1,
+                         reason='Pywikibot unit test')
+        self.assertEqual(r, None)
+        self.assertEqual(site.page_restrictions(page=p1),
+                         {u'edit': (u'sysop', u'infinity'),
+                          u'move': (u'autoconfirmed', u'infinity')})
+
+        expiry = pywikibot.Timestamp.fromISOformat('2050-01-01T00:00:00Z')
+        site.protect(protections={'edit': 'sysop', 'move': 'autoconfirmed'},
+                     page=p1,
+                     expiry=expiry,
+                     reason='Pywikibot unit test')
+
+        self.assertEqual(site.page_restrictions(page=p1),
+                         {u'edit': (u'sysop', u'2050-01-01T00:00:00Z'),
+                          u'move': (u'autoconfirmed', 
u'2050-01-01T00:00:00Z')})
+
+        site.protect(protections={'edit': '', 'move': ''},
+                     page=p1,
+                     reason='Pywikibot unit test')
+        self.assertEqual(site.page_restrictions(page=p1), {})
+
+    def test_protect_alt(self):
+        """Test the site.protect() method, works around T78522."""
+        site = self.get_site()
+        p1 = pywikibot.Page(site, u'User:Unicodesnowman/ProtectTest')
+
+        r = site.protect(protections={'edit': 'sysop', 'move': 
'autoconfirmed'},
+                         page=p1,
+                         reason='Pywikibot unit test')
+        self.assertEqual(r, None)
+        self.assertEqual(site.page_restrictions(page=p1),
+                         {u'edit': (u'sysop', u'infinity'),
+                          u'move': (u'autoconfirmed', u'infinity')})
+
+        p1 = pywikibot.Page(site, u'User:Unicodesnowman/ProtectTest')
+        expiry = pywikibot.Timestamp.fromISOformat('2050-01-01T00:00:00Z')
+        site.protect(protections={'edit': 'sysop', 'move': 'autoconfirmed'},
+                     page=p1,
+                     expiry=expiry,
+                     reason='Pywikibot unit test')
+
+        self.assertEqual(site.page_restrictions(page=p1),
+                         {u'edit': (u'sysop', u'2050-01-01T00:00:00Z'),
+                          u'move': (u'autoconfirmed', 
u'2050-01-01T00:00:00Z')})
+
+        p1 = pywikibot.Page(site, u'User:Unicodesnowman/ProtectTest')
+        site.protect(protections={'edit': '', 'move': ''},
+                     page=p1,
+                     reason='Pywikibot unit test')
+        self.assertEqual(site.page_restrictions(page=p1), {})
+
+    def test_protect_exception(self):
+        """Test that site.protect() throws an exception when passed invalid 
args."""
+        site = self.get_site()
+        p1 = pywikibot.Page(site, u'User:Unicodesnowman/ProtectTest')
+        self.assertRaises(pywikibot.Error, site.protect,
+                          protections={'anInvalidValue': 'sysop'},
+                          page=p1, reason='Pywikibot unit test')
+        self.assertRaises(pywikibot.Error, site.protect,
+                          protections={'edit': 'anInvalidValue'},
+                          page=p1, reason='Pywikibot unit test')
+
+    def test_delete(self):
+        """Test the site.deletepage() and site.undelete_page() methods."""
+        site = self.get_site()
+        p = pywikibot.Page(site, u'User:Unicodesnowman/DeleteTestSite')
+        # Verify state
+        if not p.exists():
+            site.undelete_page(p, 'pywikibot unit tests')
+
+        site.deletepage(p, reason='pywikibot unit tests')
+        self.assertRaises(pywikibot.NoPage, p.get, force=True)
+
+        site.undelete_page(p, 'pywikibot unit tests',
+                           revisions=[u'2014-12-21T06:07:47Z',
+                                      u'2014-12-21T06:07:31Z'])
+
+        revs = list(p.getVersionHistory())
+        self.assertEqual(len(revs), 2)
+        self.assertEqual(revs[0].revid, 219995)
+        self.assertEqual(revs[1].revid, 219994)
+
+        site.deletepage(p, reason='pywikibot unit tests')
+        site.undelete_page(p, 'pywikibot unit tests')
+        revs = list(p.getVersionHistory())
+        self.assertTrue(len(revs) > 2)
+
+
 class SiteUserTestCase2(DefaultSiteTestCase):
 
     """More tests that rely on a user account."""
@@ -1159,6 +1281,11 @@
     def testPatrol(self):
         """Test the site.patrol() method."""
         mysite = self.get_site()
+
+        if 'patrol' not in mysite.tokens:
+            raise unittest.SkipTest(
+                "Action patrol is not allowed for user {0} on wiki {1}"
+                .format(mysite.user(), mysite))
 
         rc = list(mysite.recentchanges(total=1))[0]
 
@@ -1228,9 +1355,6 @@
             self.assertIsInstance(rndpage, pywikibot.Page)
             self.assertIn(rndpage.namespace(), [6, 7])
 
-    # TODO: test newimages, longpages, shortpages, ancientpages, unwatchedpages
-    #       and the other following methods in site.py
-
 
 class TestSiteTokens(DefaultSiteTestCase):
 
@@ -1241,7 +1365,7 @@
     def setUp(self):
         """Store version."""
         self.mysite = self.get_site()
-        self._version = LV(self.mysite.version())
+        self._version = MediaWikiVersion(self.mysite.version())
         self.orig_version = self.mysite.version
 
     def tearDown(self):
@@ -1249,11 +1373,18 @@
         self.mysite.version = self.orig_version
 
     def _test_tokens(self, version, test_version, in_tested, additional_token):
-        if version and self._version < LV(version):
+        if version and self._version < MediaWikiVersion(version):
             raise unittest.SkipTest(
                 u'Site %s version %s is too low for this tests.'
                 % (self.mysite, self._version))
+
+        if in_tested not in self.mysite.tokens:
+            raise unittest.SkipTest(
+                'Action %s is not allowed for user %s on wiki %s.'
+                % (in_tested, self.mysite.user(), self.mysite))
+
         self.mysite.version = lambda: test_version
+
         for ttype in ("edit", "move", additional_token):
             try:
                 token = self.mysite.tokens[ttype]

-- 
To view, visit https://gerrit.wikimedia.org/r/181883
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2bb23452880ce624c382bf7b5b8929a64f7e5fb7
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Maverick <[email protected]>

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

Reply via email to