jenkins-bot has submitted this change and it was merged.
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, 250 insertions(+), 5 deletions(-)
Approvals:
XZise: Looks good to me, approved
jenkins-bot: Verified
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..7258cc8 100644
--- a/tests/family_tests.py
+++ b/tests/family_tests.py
@@ -77,6 +77,17 @@
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)
+ # redirected code (see site tests test_alias_code_site)
+ self.assertEqual(family.obsolete['dk'], 'da')
+ # closed/locked site (see site tests test_locked_site)
+ self.assertEqual(family.obsolete['mh'], None)
+ # offline site (see site tests test_removed_site)
+ 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'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..c3e91c5 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,195 @@
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 production sites in its
family."""
+
+ sites = {
+ 'wikia': {
+ 'family': 'wikia',
+ 'code': 'wikia',
+ },
+ 'lyricwiki': {
+ 'family': 'lyricwiki',
+ 'code': 'en',
+ },
+ 'commons': {
+ 'family': 'commons',
+ 'code': 'commons',
+ },
+ 'wikidata': {
+ 'family': 'wikidata',
+ 'code': 'wikidata',
+ },
+ 'wikidatatest': {
+ 'family': 'wikidata',
+ 'code': 'test',
+ },
+ }
+
+ 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')
+
+ def test_wikidata(self):
+ """Test Wikidata family, with sites for test and
production."""
+ site = self.get_site('wikidata')
+ self.assertEqual(site.hostname(), 'www.wikidata.org')
+ self.assertEqual(site.code, 'wikidata')
+ self.assertIsInstance(site.namespaces, dict)
+ self.assertFalse(site.obsolete)
+
+ self.assertRaises(KeyError, site.family.hostname, 'en')
+
+ pywikibot.config.family = 'wikidata'
+ pywikibot.config.mylang = 'en'
+
+ site2 = pywikibot.Site('test')
+ self.assertEqual(site2.hostname(), 'test.wikidata.org')
+ self.assertEqual(site2.code, 'test')
+
+ # Languages cant be used due to T71255
+ self.assertRaises(pywikibot.UnknownSite,
+ pywikibot.Site, 'en', 'wikidata')
+
+
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: merged
Gerrit-Change-Id: I3d1bcf23134a0543ababc8f14ffa4ecc284535fd
Gerrit-PatchSet: 4
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 <>