John Vandenberg has uploaded a new change for review.

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

Change subject: Obsolete and single code site tests
......................................................................

Obsolete and single code site tests

Add tests to capture the current behaviour of obsolete sites
and sites with only one code.

Moved a family related assert from site_tests into family_tests.

Change-Id: I3d1bcf23134a0543ababc8f14ffa4ecc284535fd
---
M tests/aspects.py
M tests/family_tests.py
M tests/http_tests.py
M tests/site_tests.py
4 files changed, 218 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core 
refs/changes/50/185150/1

diff --git a/tests/aspects.py b/tests/aspects.py
index b6b0956..41f5071 100644
--- a/tests/aspects.py
+++ b/tests/aspects.py
@@ -815,7 +815,12 @@
                 data['site'] = Site(data['code'], data['family'],
                                     interface=interface)
             if 'hostname' not in data and 'site' in data:
-                data['hostname'] = data['site'].hostname()
+                try:
+                    data['hostname'] = data['site'].hostname()
+                except KeyError:
+                    # The family has defined this as obsolete
+                    # without a mapping to a hostname.
+                    pass
 
         if not hasattr(cls, 'cached') or not cls.cached:
             pywikibot._sites = orig_sites
diff --git a/tests/family_tests.py b/tests/family_tests.py
index 3cbadea..e174a9b 100644
--- a/tests/family_tests.py
+++ b/tests/family_tests.py
@@ -77,6 +77,14 @@
         other = 'unknown'
         self.assertRaises(UnknownFamily, family.__eq__, other)
 
+    def test_obsolete(self):
+        """Test three types of obsolete codes."""
+        family = Family.load('wikipedia')
+        self.assertIsInstance(family.obsolete, dict)
+        self.assertEqual(family.obsolete['dk'], 'da')
+        self.assertEqual(family.obsolete['mh'], None)
+        self.assertEqual(family.obsolete['ru-sib'], None)
+
 
 class TestOldFamilyMethod(DeprecationTestCase):
 
diff --git a/tests/http_tests.py b/tests/http_tests.py
index 4b1a885..846069f 100644
--- a/tests/http_tests.py
+++ b/tests/http_tests.py
@@ -9,9 +9,13 @@
 
 import sys
 
+import httplib2
+
 import pywikibot
-from pywikibot.comms import http, threadedhttp
+
 from pywikibot import config2 as config
+from pywikibot.comms import http, threadedhttp
+
 from tests.aspects import unittest, TestCase
 from tests.utils import expected_failure_if
 
@@ -129,16 +133,48 @@
 
         self.assertEqual(organisation, 'TuxFamily.org non-profit organization')
 
+
+class TestHttpStatus(TestCase):
+
+    """Test HTTP status code handling and errors."""
+
+    sites = {
+        'getstatuscode': {
+            'hostname': 'getstatuscode.com',
+        },
+        'enwp': {
+            'hostname': 'en.wikipedia.org',
+        },
+        'gandi': {
+            'hostname': 'www.gandi.eu',
+        },
+    }
+
     def test_http_504(self):
         """Test that a HTTP 504 raises the correct exception."""
         self.assertRaises(pywikibot.Server504Error,
                           http.fetch,
                           uri='http://getstatuscode.com/504')
 
+    def test_server_not_found(self):
+        """Test server not found exception."""
+        self.assertRaises(httplib2.ServerNotFoundError,
+                          http.fetch,
+                          uri='http://ru-sib.wikipedia.org/w/api.php',
+                          default_error_handling=True)
+
+    def test_invalid_scheme(self):
+        """Test invalid scheme."""
+        # A KeyError is raised within httplib2, in a different thread
+        self.assertRaises(KeyError,
+                          http.fetch,
+                          uri='invalid://url')
+
     def test_follow_redirects(self):
         """Test follow 301 redirects after an exception works correctly."""
-        # to be effective, this exception should be raised in httplib2
-        self.assertRaises(Exception,
+        # It doesnt matter what exception is raised here, provided it
+        # occurs within the httplib2 request method.
+        self.assertRaises(KeyError,
                           http.fetch,
                           uri='invalid://url')
 
diff --git a/tests/site_tests.py b/tests/site_tests.py
index 55e3d3f..a3734c5 100644
--- a/tests/site_tests.py
+++ b/tests/site_tests.py
@@ -16,6 +16,7 @@
 
 import pywikibot
 from pywikibot import config
+from pywikibot.comms import http
 from pywikibot.tools import MediaWikiVersion
 from pywikibot.data import api
 
@@ -25,6 +26,7 @@
     WikimediaDefaultSiteTestCase,
     WikidataTestCase,
     DefaultWikidataClientTestCase,
+    AlteredDefaultSiteTestCase,
 )
 from tests.utils import allowed_failure, allowed_failure_if
 
@@ -173,10 +175,12 @@
         langs = mysite.languages()
         self.assertIsInstance(langs, list)
         self.assertIn(mysite.code, langs)
-        mysite.family.obsolete
+        self.assertIsInstance(mysite.obsolete, bool)
         ipf = mysite.interwiki_putfirst()
         if ipf:  # Not all languages use this
             self.assertIsInstance(ipf, list)
+        else:
+            self.assertIsNone(ipf)
 
         for item in mysite.validLanguageLinks():
             self.assertIn(item, langs)
@@ -2151,6 +2155,166 @@
         self.assertFalse(site.sametitle('Invalid:Foo', ':Foo'))
         self.assertFalse(site.sametitle('Invalid:Foo', 'Invalid:foo'))
 
+
+class TestObsoleteSite(TestCase):
+
+    """Test 'closed' and obsolete code sites."""
+
+    # hostname() fails, so it is provided here otherwise the
+    # test class fails with hostname not defined for mh.wikipedia.org
+    sites = {
+        'mhwp': {
+            'family': 'wikipedia',
+            'code': 'mh',
+            'hostname': 'mh.wikipedia.org',
+        },
+        # pywikibot should never attempt to access jp.wikipedia.org,
+        # however this entry ensures that there is a change in the builds
+        # if jp.wikipedia.org goes offline.
+        'jpwp': {
+            'family': 'wikipedia',
+            'code': 'jp',
+            'hostname': 'jp.wikipedia.org',
+        },
+        'jawp': {
+            'family': 'wikipedia',
+            'code': 'ja',
+        },
+    }
+
+    def test_locked_site(self):
+        """Test Wikimedia closed/locked site."""
+        site = self.get_site('mhwp')
+        self.assertEqual(site.code, 'mh')
+        self.assertIsInstance(site.obsolete, bool)
+        self.assertTrue(site.obsolete)
+        self.assertRaises(KeyError, site.hostname)
+        r = http.fetch(uri='http://mh.wikipedia.org/w/api.php',
+                       default_error_handling=False)
+        self.assertEqual(r.status, 200)
+
+    def test_removed_site(self):
+        """Test Wikimedia offline site."""
+        site = pywikibot.Site('ru-sib', 'wikipedia')
+        self.assertEqual(site.code, 'ru-sib')
+        self.assertIsInstance(site.obsolete, bool)
+        self.assertTrue(site.obsolete)
+        self.assertRaises(KeyError, site.hostname)
+        # See also http_tests, which tests that ru-sib.wikipedia.org is offline
+
+    def test_alias_code_site(self):
+        """Test Wikimedia site with an alias code."""
+        site = self.get_site('jpwp')
+        self.assertIsInstance(site.obsolete, bool)
+        self.assertEqual(site.code, 'ja')
+        self.assertFalse(site.obsolete)
+        self.assertEqual(site.hostname(), 'ja.wikipedia.org')
+        self.assertEqual(site.ssl_hostname(), 'ja.wikipedia.org')
+
+
+class TestSingleCodeFamilySite(AlteredDefaultSiteTestCase):
+
+    """Test site without other sites in its family."""
+
+    sites = {
+        'wikia': {
+            'family': 'wikia',
+            'code': 'wikia',
+        },
+        'lyricwiki': {
+            'family': 'lyricwiki',
+            'code': 'en',
+        },
+        'commons': {
+            'family': 'commons',
+            'code': 'commons',
+        },
+    }
+
+    def test_wikia(self):
+        """Test www.wikia.com."""
+        site = self.get_site('wikia')
+        self.assertEqual(site.hostname(), 'www.wikia.com')
+        self.assertEqual(site.code, 'wikia')
+        self.assertIsInstance(site.namespaces, dict)
+        self.assertFalse(site.obsolete)
+        self.assertEqual(site.family.hostname('en'), 'www.wikia.com')
+        self.assertEqual(site.family.hostname('wikia'), 'www.wikia.com')
+        self.assertEqual(site.family.hostname('www'), 'www.wikia.com')
+
+        pywikibot.config.family = 'wikia'
+        pywikibot.config.mylang = 'de'
+
+        site2 = pywikibot.Site('www', 'wikia')
+        self.assertEqual(site2.code, 'wikia')
+        self.assertFalse(site2.obsolete)
+        self.assertEqual(site, site2)
+        self.assertEqual(pywikibot.config.mylang, 'de')
+
+        site2 = pywikibot.Site('really_invalid', 'wikia')
+        self.assertEqual(site2.code, 'wikia')
+        self.assertFalse(site2.obsolete)
+        self.assertEqual(site, site2)
+        self.assertEqual(pywikibot.config.mylang, 'de')
+
+        site2 = pywikibot.Site('de', 'wikia')
+        self.assertEqual(site2.code, 'wikia')
+        self.assertFalse(site2.obsolete)
+        self.assertEqual(site, site2)
+        # When the code is the same as config.mylang, Site() changes mylang
+        self.assertEqual(pywikibot.config.mylang, 'wikia')
+
+    def test_lyrics(self):
+        """Test lyrics.wikia.com."""
+        site = self.get_site('lyricwiki')
+        self.assertEqual(site.hostname(), 'lyrics.wikia.com')
+        self.assertEqual(site.code, 'en')
+        self.assertIsInstance(site.namespaces, dict)
+        self.assertFalse(site.obsolete)
+        self.assertEqual(site.family.hostname('en'), 'lyrics.wikia.com')
+
+        self.assertRaises(KeyError, site.family.hostname, 'lyrics')
+        self.assertRaises(KeyError, site.family.hostname, 'lyricwiki')
+
+        self.assertRaises(pywikibot.UnknownSite, pywikibot.Site,
+                          'lyricwiki', 'lyricwiki')
+
+        self.assertRaises(pywikibot.UnknownSite, pywikibot.Site,
+                          'de', 'lyricwiki')
+
+    def test_commons(self):
+        """Test Wikimedia Commons."""
+        site = self.get_site('commons')
+        self.assertEqual(site.hostname(), 'commons.wikimedia.org')
+        self.assertEqual(site.code, 'commons')
+        self.assertIsInstance(site.namespaces, dict)
+        self.assertFalse(site.obsolete)
+
+        self.assertRaises(KeyError, site.family.hostname, 'en')
+
+        pywikibot.config.family = 'commons'
+        pywikibot.config.mylang = 'de'
+
+        site2 = pywikibot.Site('en', 'commons')
+        self.assertEqual(site2.code, 'commons')
+        self.assertFalse(site2.obsolete)
+        self.assertEqual(site, site2)
+        self.assertEqual(pywikibot.config.mylang, 'de')
+
+        site2 = pywikibot.Site('really_invalid', 'commons')
+        self.assertEqual(site2.code, 'commons')
+        self.assertFalse(site2.obsolete)
+        self.assertEqual(site, site2)
+        self.assertEqual(pywikibot.config.mylang, 'de')
+
+        site2 = pywikibot.Site('de', 'commons')
+        self.assertEqual(site2.code, 'commons')
+        self.assertFalse(site2.obsolete)
+        self.assertEqual(site, site2)
+        # When the code is the same as config.mylang, Site() changes mylang
+        self.assertEqual(pywikibot.config.mylang, 'commons')
+
+
 if __name__ == '__main__':
     try:
         unittest.main()

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

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

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

Reply via email to