jenkins-bot has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/677241 )
Change subject: [tests] add tests for interwikimap ......................................................................
[tests] add tests for interwikimap
Also show a more informative ValueError in Family.from_url()
Patch detached from 72c5aa882c0
Change-Id: I8b9759b85a21c404562a6470eeff6f87f8329b1d --- M pywikibot/family.py M tests/__init__.py M tests/family_tests.py A tests/interwikimap_tests.py 4 files changed, 161 insertions(+), 4 deletions(-)
Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
diff --git a/pywikibot/family.py b/pywikibot/family.py index 6180cf2..3f3ff72 100644 --- a/pywikibot/family.py +++ b/pywikibot/family.py @@ -840,8 +840,8 @@ # Discard $1 and everything after it path, _, suffix = path.partition('$1') if suffix: - raise ValueError('Text after the $1 placeholder is not supported ' - '(T111513).') + raise ValueError('Url: {}\nText {} after the $1 placeholder is ' + 'not supported (T111513).'.format(url, suffix))
for domain in self.domains: if domain in parsed.netloc: diff --git a/tests/__init__.py b/tests/__init__.py index 5cccc06..219b263 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -93,6 +93,7 @@ 'i18n', 'interwiki_graph', 'interwiki_link', + 'interwikimap', 'link', 'linter', 'logentries', diff --git a/tests/family_tests.py b/tests/family_tests.py index 7d3dcd7..bd60bab 100644 --- a/tests/family_tests.py +++ b/tests/family_tests.py @@ -197,8 +197,8 @@ # Text after $1 is not allowed with self.assertRaisesRegex( ValueError, - r'Text after the $1 placeholder is not supported' - r' (T111513)'): + 'Url: .+\nText /foo after the ' + r'$1 placeholder is not supported (T111513).'): f.from_url('//vo.wikipedia.org/wiki/$1/foo')
# the IWM may contain the wrong protocol, but it's only used to diff --git a/tests/interwikimap_tests.py b/tests/interwikimap_tests.py new file mode 100644 index 0000000..815667d --- /dev/null +++ b/tests/interwikimap_tests.py @@ -0,0 +1,156 @@ +"""Tests for the site module.""" +# +# (C) Pywikibot team, 2018-2021 +# +# Distributed under the terms of the MIT license. +# +import unittest + +import pywikibot + +from tests.aspects import DefaultSiteTestCase + + +class TestInterwikiMap(DefaultSiteTestCase): + + """Test interwiki map and methods.""" + + sites = { + 'enwikinews': { + 'family': 'wikinews', + 'code': 'en', + }, + 'enwikibooks': { + 'family': 'wikibooks', + 'code': 'en', + }, + 'enwikiquote': { + 'family': 'wikiquote', + 'code': 'en', + }, + 'enwiktionary': { + 'family': 'wiktionary', + 'code': 'en', + }, + 'enws': { + 'family': 'wikisource', + 'code': 'en', + }, + 'dews': { + 'family': 'wikisource', + 'code': 'de', + }, + 'meta': { + 'family': 'meta', + 'code': 'meta', + }, + 'mediawiki': { + 'family': 'mediawiki', + 'code': 'mediawiki', + }, + 'commons': { + 'family': 'commons', + 'code': 'commons', + }, + 'wikidata': { + 'family': 'wikidata', + 'code': 'wikidata', + }, + } + + def test_interwikimap(self, key): + """Test interwiki map.""" + site = self.get_site(key) + iw_map = site._interwikimap + self.assertEqual(site, iw_map._site) + # test reset() + iw_map._map = 'foo' + iw_map.reset() + self.assertIsNone(iw_map._map) + + def test_iw_entry(self): + """Test interwiki map entry.""" + site = self.get_site('dews') + iw_map = site._interwikimap + self.assertIsNone(iw_map._map) + iw_map._iw_sites # load data + self.assertIsInstance(iw_map._map, dict) + for entry in iw_map._map.values(): + with self.subTest(url=entry.url): + self.assertIsNone(entry._site) + self.assertIsInstance(entry.local, bool) + self.assertIsInstance(entry.prefix, str) + if not entry.local: + continue + + self.assertTrue( + entry.url.startswith(('http', 'irc://')), + entry.url + ' does not start with "http" or "irc://') + + def test_interwiki(self, key): + """Test site.interwiki method.""" + site = self.get_site(key) + prefix = self.sites[key]['family'] + if prefix == 'mediawiki': + with self.assertRaises(KeyError): + site.interwiki(prefix) + else: + iw_site = site.interwiki(prefix) + self.assertEqual(iw_site.family, site.family) + + def test_interwiki_prefix(self, key): + """Test site.interwiki_prefix method.""" + self.assertTrue(True) + + +class TestInterwikiMapPrefix(DefaultSiteTestCase): + + """Test interwiki map and methods.""" + + def setUp(self): + """Setup tests.""" + super().setUp() + self.iw_map = self.site._interwikimap + + def test_items(self): + """Test interwikimap items.""" + prefixes = { + 'commons': 'commons', + 'mediawikiwiki': 'mediawiki', + 'meta': 'meta', + 'test': 'wikipedia', + 'als': 'wikipedia', + 'bar': 'wikipedia', + 'de': 'wikipedia', + 'fr': 'wikipedia', + 'frr': 'wikipedia', + 'gsw': 'wikipedia', + 'mw': 'mediawiki', + 'nb': 'wikipedia', + 'no': 'wikipedia', + 'tr': 'wikipedia', + 'zh': 'wikipedia', + } + for prefix, family in prefixes.items(): + # special cases + if prefix in ('gsw', # unknown wikipedia language + 'test', # not an interwiki prefix + ): + continue + + item = self.iw_map[prefix] + self.assertEqual(item._site, pywikibot.Site(prefix, family)) + self.assertTrue(item.local) + + def test_invalid_prefix(self): + """Test wrong interwiki prefix.""" + for prefix in ('foo', 'mediawiki', 'test', ): + with self.subTest(prefix=prefix), self.assertRaises(KeyError): + self.iw_map[prefix] + + +if __name__ == '__main__': # pragma: no cover + try: + unittest.main() + except SystemExit: + pass
pywikibot-commits@lists.wikimedia.org