jenkins-bot submitted this change.

View Change

Approvals: Xqt: Looks good to me, approved jenkins-bot: Verified
[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(-)

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

To view, visit change 677241. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I8b9759b85a21c404562a6470eeff6f87f8329b1d
Gerrit-Change-Number: 677241
Gerrit-PatchSet: 3
Gerrit-Owner: Xqt <info@gno.de>
Gerrit-Reviewer: Xqt <info@gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged