Magul has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/327580 )

Change subject: Rerun site links methods tests on failure
......................................................................

Rerun site links methods tests on failure

Bug: T92856
Change-Id: Ib087f2c5414b090fd66fb5116a284bb9c7d1a669
---
M tests/site_detect_tests.py
M tests/site_tests.py
M tests/utils.py
3 files changed, 138 insertions(+), 61 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core 
refs/changes/80/327580/1

diff --git a/tests/site_detect_tests.py b/tests/site_detect_tests.py
index c808b0a..cfc3d7b 100644
--- a/tests/site_detect_tests.py
+++ b/tests/site_detect_tests.py
@@ -14,37 +14,10 @@
 from pywikibot.site_detect import MWSite
 
 from tests.aspects import unittest, TestCase
+from tests.utils import retry_few_times
 
 
 __version__ = '$Id$'
-
-
-def _retry_few_times(retry_limit):
-    """
-    Decorator to retry test on failure.
-
-    Swallow AssertionError retry_limit times before failing test.
-
-    @param retry_limit: Retry limit before failing test
-    @type retry_limit: int
-    @return: a decorator to retry test on failure
-    @rtype: function
-    @raises AssertionError: all retries of test failed
-    """
-    def actual_decorator(wrapped_func):
-        def wrapper_func(*args, **kwargs):
-            for retry_no in range(1, retry_limit + 1):
-                try:
-                    wrapped_func(*args, **kwargs)
-                except AssertionError:
-                    if retry_no == retry_limit:
-                        raise
-                except:
-                    raise
-                else:
-                    return
-        return wrapper_func
-    return actual_decorator
 
 
 class SiteDetectionTestCase(TestCase):
@@ -100,7 +73,7 @@
         """Test detection of MediaWiki sites for en.citizendium.org."""
         self.assertSite('http://en.citizendium.org/wiki/$1')
 
-    @_retry_few_times(10)
+    @retry_few_times(10)
     def test_wikichristian(self):
         """Test detection of MediaWiki sites for www.wikichristian.org.
 
diff --git a/tests/site_tests.py b/tests/site_tests.py
index a504d44..bb16655 100644
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -45,7 +45,12 @@
     AlteredDefaultSiteTestCase,
 )
 from tests.basepage_tests import BasePageLoadRevisionsCachingTestBase
-from tests.utils import allowed_failure, allowed_failure_if, entered_loop
+from tests.utils import (
+    allowed_failure,
+    allowed_failure_if,
+    entered_loop,
+    retry_few_times,
+)
 
 
 class TokenTestBase(TestCaseBase):
@@ -457,12 +462,15 @@
                               namespaces=1)
         self.assertEqual(gen.request['gblnamespace'], [1])
 
-    def testLinkMethods(self):
-        """Test site methods for getting links to and from a page."""
+    @retry_few_times(10)
+    def test_pagebacklinks(self):
+        """Test site generator pagebacklinks()."""
         if self.site.family.name == 'wpbeta':
             raise unittest.SkipTest('Test fails on betawiki; T69931')
+
         mysite = self.get_site()
         mainpage = self.get_mainpage()
+
         backlinks = set(mysite.pagebacklinks(mainpage, namespaces=[0]))
         # only non-redirects:
         filtered = set(mysite.pagebacklinks(mainpage, namespaces=0,
@@ -474,6 +482,7 @@
         indirect = set(mysite.pagebacklinks(mainpage, namespaces=[0],
                                             followRedirects=True,
                                             filterRedirects=False))
+
         self.assertEqual(filtered & redirs, set([]))
         self.assertEqual(indirect & redirs, set([]))
         self.assertLessEqual(filtered, indirect)
@@ -483,20 +492,19 @@
             backlinks,
             set(self.site.pagebacklinks(mainpage, namespaces=[0, 2])))
 
-        # pagereferences includes both backlinks and embeddedin
-        embedded = set(mysite.page_embeddedin(mainpage, namespaces=[0]))
-        refs = set(mysite.pagereferences(mainpage, namespaces=[0]))
-        self.assertTrue(backlinks.issubset(refs))
-        self.assertTrue(embedded.issubset(refs))
         for bl in backlinks:
             self.assertIsInstance(bl, pywikibot.Page)
-            self.assertIn(bl, refs)
-        for ei in embedded:
-            self.assertIsInstance(ei, pywikibot.Page)
-            self.assertIn(ei, refs)
-        for ref in refs:
-            self.assertIn(ref, backlinks | embedded)
-        # test embeddedin arguments
+
+    @retry_few_times(10)
+    def test_page_embeddedin(self):
+        """Test site generator page_embeddedin()."""
+        if self.site.family.name == 'wpbeta':
+            raise unittest.SkipTest('Test fails on betawiki; T69931')
+
+        mysite = self.get_site()
+        mainpage = self.get_mainpage()
+
+        embedded = set(mysite.page_embeddedin(mainpage, namespaces=[0]))
         self.assertTrue(embedded.issuperset(
             set(mysite.page_embeddedin(mainpage, filterRedirects=True,
                                        namespaces=[0]))))
@@ -505,21 +513,43 @@
                                        namespaces=[0]))))
         self.assertTrue(embedded.issubset(
             set(mysite.page_embeddedin(mainpage, namespaces=[0, 2]))))
+        for ei in embedded:
+            self.assertIsInstance(ei, pywikibot.Page)
+
+    @retry_few_times(10)
+    def test_pagereferences(self):
+        """Test site generator pagereferences()."""
+        if self.site.family.name == 'wpbeta':
+            raise unittest.SkipTest('Test fails on betawiki; T69931')
+
+        mysite = self.get_site()
+        mainpage = self.get_mainpage()
+
+        # pagereferences includes both backlinks and embeddedin
+        backlinks = set(mysite.pagebacklinks(mainpage, namespaces=[0]))
+        embedded = set(mysite.page_embeddedin(mainpage, namespaces=[0]))
+        refs = set(mysite.pagereferences(mainpage, namespaces=[0]))
+        self.assertTrue(backlinks.issubset(refs))
+        self.assertTrue(embedded.issubset(refs))
+        for bl in backlinks:
+            self.assertIn(bl, refs)
+        for ei in embedded:
+            self.assertIn(ei, refs)
+        for ref in refs:
+            self.assertIn(ref, backlinks | embedded)
+
+    @retry_few_times(10)
+    def test_pagelinks(self):
+        """Test site generator pagelinks()."""
+        if self.site.family.name == 'wpbeta':
+            raise unittest.SkipTest('Test fails on betawiki; T69931')
+
+        mysite = self.get_site()
+        mainpage = self.get_mainpage()
+
         links = set(mysite.pagelinks(mainpage))
         for pl in links:
             self.assertIsInstance(pl, pywikibot.Page)
-        # test links arguments
-        # TODO: There have been build failures because the following assertion
-        # wasn't true. Bug: T92856
-        # Example: 
https://travis-ci.org/wikimedia/pywikibot-core/jobs/54552081#L505
-        namespace_links = set(mysite.pagelinks(mainpage, namespaces=[0, 1]))
-        if namespace_links - links:
-            unittest_print(
-                'FAILURE wrt T92856:\nSym. difference: "{0}"'.format(
-                    '", "'.join(
-                        '{0}@{1}'.format(link.namespace(),
-                                         link.title(withNamespace=False))
-                        for link in namespace_links ^ links)))
         self.assertCountEqual(
             set(mysite.pagelinks(mainpage, namespaces=[0, 1])) - links, [])
         for target in mysite.preloadpages(mysite.pagelinks(mainpage,
@@ -527,23 +557,69 @@
                                                            total=5)):
             self.assertIsInstance(target, pywikibot.Page)
             self.assertFalse(target.isRedirectPage())
-        # test pagecategories
+
+    @retry_few_times(10)
+    def test_pagecategories(self):
+        """Test site generator pagecategories()."""
+        if self.site.family.name == 'wpbeta':
+            raise unittest.SkipTest('Test fails on betawiki; T69931')
+
+        mysite = self.get_site()
+        mainpage = self.get_mainpage()
+
         for cat in mysite.pagecategories(mainpage):
             self.assertIsInstance(cat, pywikibot.Category)
             for cm in mysite.categorymembers(cat):
                 self.assertIsInstance(cat, pywikibot.Page)
-        # test pageimages
+
+    @retry_few_times(10)
+    def test_pageimages(self):
+        """Test site generator pageimages()."""
+        if self.site.family.name == 'wpbeta':
+            raise unittest.SkipTest('Test fails on betawiki; T69931')
+
+        mysite = self.get_site()
+        mainpage = self.get_mainpage()
+
         self.assertTrue(all(isinstance(im, pywikibot.FilePage)
                             for im in mysite.pageimages(mainpage)))
-        # test pagetemplates
+
+    @retry_few_times(10)
+    def test_pagetemplates(self):
+        """Test site generator pagetemplates()."""
+        if self.site.family.name == 'wpbeta':
+            raise unittest.SkipTest('Test fails on betawiki; T69931')
+
+        mysite = self.get_site()
+        mainpage = self.get_mainpage()
+
         self.assertTrue(all(isinstance(te, pywikibot.Page)
                             for te in mysite.pagetemplates(mainpage)))
         self.assertTrue(set(mysite.pagetemplates(mainpage)).issuperset(
                         set(mysite.pagetemplates(mainpage, namespaces=[10]))))
-        # test pagelanglinks
+
+    @retry_few_times(10)
+    def test_pagelanglinks(self):
+        """Test site generator pagelanglinks()."""
+        if self.site.family.name == 'wpbeta':
+            raise unittest.SkipTest('Test fails on betawiki; T69931')
+
+        mysite = self.get_site()
+        mainpage = self.get_mainpage()
+
         for ll in mysite.pagelanglinks(mainpage):
             self.assertIsInstance(ll, pywikibot.Link)
-        # test page_extlinks
+
+
+    @retry_few_times(10)
+    def test_page_extlinks(self):
+        """Test site generator page_extlinks()."""
+        if self.site.family.name == 'wpbeta':
+            raise unittest.SkipTest('Test fails on betawiki; T69931')
+
+        mysite = self.get_site()
+        mainpage = self.get_mainpage()
+
         self.assertTrue(all(isinstance(el, basestring)
                             for el in mysite.page_extlinks(mainpage)))
 
diff --git a/tests/utils.py b/tests/utils.py
index 7ff1594..45af3cc 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -127,6 +127,34 @@
         return lambda orig: orig
 
 
+def retry_few_times(retry_limit):
+    """
+    Decorator to retry test on failure.
+
+    Swallow AssertionError retry_limit times before failing test.
+
+    @param retry_limit: Retry limit before failing test
+    @type retry_limit: int
+    @return: a decorator to retry test on failure
+    @rtype: function
+    @raises AssertionError: all retries of test failed
+    """
+    def actual_decorator(wrapped_func):
+        def wrapper_func(*args, **kwargs):
+            for retry_no in range(1, retry_limit + 1):
+                try:
+                    wrapped_func(*args, **kwargs)
+                except AssertionError:
+                    if retry_no == retry_limit:
+                        raise
+                except:
+                    raise
+                else:
+                    return
+        return wrapper_func
+    return actual_decorator
+
+
 def add_metaclass(cls):
     """Call six's add_metaclass with the site's __metaclass__ in Python 3."""
     if not PY2:

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib087f2c5414b090fd66fb5116a284bb9c7d1a669
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: Magul <tomasz.magul...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to