Xqt has submitted this change. ( https://gerrit.wikimedia.org/r/c/pywikibot/core/+/909678 )
Change subject: [tests] detach site_obsolete_tests.py (part 2) ......................................................................
[tests] detach site_obsolete_tests.py (part 2)
Change-Id: Idab41c2d1ea840198f820a5e1bff29c2f231fd83 --- M docs/tests_ref/index.rst R tests/site_tests.py A docs/tests_ref/site_obsolete_tests.rst M tests/__init__.py M tests/site_obsolete_tests.py 5 files changed, 24 insertions(+), 1,340 deletions(-)
Approvals: Xqt: Verified; Looks good to me, approved
diff --git a/docs/tests_ref/index.rst b/docs/tests_ref/index.rst index 5b492fe..ea35962 100644 --- a/docs/tests_ref/index.rst +++ b/docs/tests_ref/index.rst @@ -64,6 +64,7 @@ site<./site_tests> site_decorators<./site_decorators_tests> site_generators<./site_generators_tests> + site_obsolete<./site_obsolete_tests> site_detect<./site_detect_tests> sparql<./sparql_tests> tests<./tests_tests> diff --git a/docs/tests_ref/site_obsolete_tests.rst b/docs/tests_ref/site_obsolete_tests.rst new file mode 100644 index 0000000..64e3814 --- /dev/null +++ b/docs/tests_ref/site_obsolete_tests.rst @@ -0,0 +1,8 @@ +********************************** +tests.site_obsolete_tests module +********************************** + +.. automodule:: tests.site_obsolete_tests + :members: + :undoc-members: + :show-inheritance: diff --git a/tests/__init__.py b/tests/__init__.py index a06d063..64629d3 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,6 +1,6 @@ """Package tests.""" # -# (C) Pywikibot team, 2007-2022 +# (C) Pywikibot team, 2007-2023 # # Distributed under the terms of the MIT license. # @@ -113,6 +113,7 @@ 'site_decorators', 'site_generators', 'site_detect', + 'site_obsolete', 'siteinfo', 'sparql', 'tests', diff --git a/tests/site_obsolete_tests.py b/tests/site_obsolete_tests.py index d3f4847..ebd43ac 100644 --- a/tests/site_obsolete_tests.py +++ b/tests/site_obsolete_tests.py @@ -1,1039 +1,20 @@ #!/usr/bin/env python3 """Tests for the site module.""" # -# (C) Pywikibot team, 2008-2023 +# (C) Pywikibot team, 2015-2023 # # Distributed under the terms of the MIT license. # -import pickle -import random -import threading -import time import unittest -from collections.abc import Iterable, Mapping from contextlib import suppress from http import HTTPStatus
import pywikibot -from pywikibot import config from pywikibot.comms import http -from pywikibot.exceptions import ( - IsNotRedirectPageError, - NoPageError, - PageInUseError, - UnknownExtensionError, - UnknownSiteError, -) from pywikibot.tools import suppress_warnings + from tests import WARN_SITE_CODE -from tests.aspects import ( - AlteredDefaultSiteTestCase, - DefaultDrySiteTestCase, - DefaultSiteTestCase, - DeprecationTestCase, - TestCase, - WikimediaDefaultSiteTestCase, -) -from tests.basepage import BasePageLoadRevisionsCachingTestBase - - -class TestSiteObjectDeprecatedFunctions(DefaultSiteTestCase, - DeprecationTestCase): - - """Test cases for Site deprecated methods on a live wiki.""" - - cached = True - - def test_allpages_filterredir_true(self): - """Test that filterredir set to 'only' is deprecated to True.""" - for page in self.site.allpages(filterredir='only', total=1): - self.assertTrue(page.isRedirectPage()) - self.assertOneDeprecation() - - def test_allpages_filterredir_talse(self): - """Test if filterredir's bool is False it's deprecated to False.""" - for page in self.site.allpages(filterredir='', total=1): - self.assertFalse(page.isRedirectPage()) - self.assertOneDeprecation() - - -class TestSiteDryDeprecatedFunctions(DefaultDrySiteTestCase, - DeprecationTestCase): - - """Test cases for Site deprecated methods without a user.""" - - def test_namespaces_callable(self): - """Test that namespaces is callable and returns itself.""" - site = self.get_site() - self.assertIs(site.namespaces(), site.namespaces) - self.assertOneDeprecationParts( - 'Referencing this attribute like a function', - 'it directly') - - -class TestSiteObject(DefaultSiteTestCase): - - """Test cases for Site methods.""" - - cached = True - - def test_pickle_ability(self): - """Test pickle ability.""" - mysite = self.get_site() - mysite_str = pickle.dumps(mysite, protocol=config.pickle_protocol) - mysite_pickled = pickle.loads(mysite_str) - self.assertEqual(mysite, mysite_pickled) - - def test_repr(self): - """Test __repr__.""" - code = self.site.family.obsolete.get(self.code) or self.code - expect = f'Site("{code}", "{self.family}")' - self.assertTrue(repr(self.site).endswith(expect)) - - def test_constructors(self): - """Test cases for site constructors.""" - test_list = [ - ['enwiki', 'wikipedia:en'], - ['eswikisource', 'wikisource:es'], - ['dewikinews', 'wikinews:de'], - ['ukwikivoyage', 'wikivoyage:uk'], - ['metawiki', 'meta:meta'], - ['commonswiki', 'commons:commons'], - ['wikidatawiki', 'wikidata:wikidata'], - ['testwikidatawiki', 'wikidata:test'], - ['testwiki', 'wikipedia:test'], # see T225729, T228300 - ['test2wiki', 'wikipedia:test2'], # see T225729 - ['sourceswiki', 'wikisource:mul'], # see T226960 - ] - if isinstance(self.site.family, pywikibot.family.WikimediaFamily): - site = self.site - else: - site = None - for dbname, sitename in test_list: - with self.subTest(dbname=dbname): - self.assertIs( - pywikibot.site.APISite.fromDBName(dbname, site), - pywikibot.Site(sitename)) - - def test_language_methods(self): - """Test cases for languages() and related methods.""" - mysite = self.get_site() - langs = mysite.languages() - self.assertIsInstance(langs, list) - self.assertIn(mysite.code, langs) - self.assertIsInstance(mysite.obsolete, bool) - ipf = mysite.interwiki_putfirst() - if ipf: # no languages use this anymore, keep it for foreign families - self.assertIsInstance(ipf, list) # pragma: no cover - else: - self.assertIsNone(ipf) - - for item in mysite.validLanguageLinks(): - self.assertIn(item, langs) - self.assertIsNone(self.site.namespaces.lookup_name(item)) - - def test_namespace_methods(self): - """Test cases for methods manipulating namespace names.""" - mysite = self.get_site() - ns = mysite.namespaces - self.assertIsInstance(ns, Mapping) - # built-in namespaces always present - self.assertIsInstance(mysite.ns_normalize('project'), str) - - for ns_id in range(-2, 16): - with self.subTest(namespace_id=ns_id): - self.assertIn(ns_id, ns) - - for key in ns: - all_ns = mysite.namespace(key, True) - with self.subTest(namespace=key): - self.assertIsInstance(key, int) - self.assertIsInstance(mysite.namespace(key), str) - self.assertNotIsInstance(all_ns, str) - self.assertIsInstance(all_ns, Iterable) - - for item in all_ns: - with self.subTest(namespace=key, item=item): - self.assertIsInstance(item, str) - - for val in ns.values(): - with self.subTest(value=val): - self.assertIsInstance(val, Iterable) - for name in val: - with self.subTest(value=val, name=name): - self.assertIsInstance(name, str) - - def test_user_attributes_return_types(self): - """Test returned types of user attributes.""" - mysite = self.get_site() - self.assertIsInstance(mysite.logged_in(), bool) - self.assertIsInstance(mysite.userinfo, dict) - - def test_messages(self): - """Test MediaWiki: messages.""" - mysite = self.get_site() - for msg in ('about', 'aboutpage', 'aboutsite', 'accesskey-n-portal'): - with self.subTest(message=msg, lang=mysite.lang): - self.assertTrue(mysite.has_mediawiki_message(msg)) - self.assertIsInstance(mysite.mediawiki_message(msg), str) - self.assertEqual( - mysite.mediawiki_message(msg), - mysite.mediawiki_message(msg, lang=mysite.lang)) - - with self.subTest(message=msg, lang='de'): - self.assertTrue(mysite.has_mediawiki_message(msg, lang='de')) - self.assertIsInstance(mysite.mediawiki_message(msg, lang='de'), - str) - - with self.subTest(message='nosuchmessage'): - self.assertFalse(mysite.has_mediawiki_message('nosuchmessage')) - with self.assertRaises(KeyError): - mysite.mediawiki_message('nosuchmessage') - - msg = ('about', 'aboutpage') - with self.subTest(messages=msg): - about_msgs = self.site.mediawiki_messages(msg) - self.assertIsInstance(mysite.mediawiki_messages(msg), dict) - self.assertTrue(mysite.mediawiki_messages(msg)) - self.assertLength(about_msgs, 2) - self.assertIn(msg[0], about_msgs) - - months = ['january', 'february', 'march', 'april', 'may_long', - 'june', 'july', 'august', 'september', 'october', - 'november', 'december'] - codes = sorted(mysite.family.codes) - lang1, lang2 = codes[0], codes[-1] - with self.subTest(messages='months', lang1=lang1, lang2=lang2): - self.assertLength(mysite.mediawiki_messages(months, lang1), 12) - self.assertLength(mysite.mediawiki_messages(months, lang2), 12) - familyname = mysite.family.name - if lang1 != lang2 and lang1 != familyname and lang2 != familyname: - self.assertNotEqual(mysite.mediawiki_messages(months, lang1), - mysite.mediawiki_messages(months, lang2)) - - with self.subTest(messages='Test messages order'): - msg = mysite.mediawiki_messages(months, 'en') - self.assertIsInstance(msg, dict) - self.assertLength(msg, 12) - self.assertEqual([key.title() for key in msg][5:], - list(msg.values())[5:]) - self.assertEqual(list(msg), months) - - # mediawiki_messages must be given a list; using a string will split it - with self.subTest(messages='about'), self.assertRaises(KeyError): - self.site.mediawiki_messages('about') - - msg = ('nosuchmessage1', 'about', 'aboutpage', 'nosuchmessage') - with self.subTest(messages=msg): - self.assertFalse(mysite.has_all_mediawiki_messages(msg)) - with self.assertRaises(KeyError): - mysite.mediawiki_messages(msg) - - with self.subTest(test='server_time'): - self.assertIsInstance(mysite.server_time(), pywikibot.Timestamp) - ts = mysite.getcurrenttimestamp() - self.assertIsInstance(ts, str) - self.assertRegex( - ts, r'(19|20)\d\d[0-1]\d[0-3]\d[0-2]\d[0-5]\d[0-5]\d') - - with self.subTest(test='months_names'): - self.assertIsInstance(mysite.months_names, list) - self.assertLength(mysite.months_names, 12) - for month in mysite.months_names: - self.assertIsInstance(month, tuple) - self.assertLength(month, 2) - - with self.subTest(test='list_to_text'): - self.assertEqual(mysite.list_to_text(('pywikibot',)), 'pywikibot') - - def test_english_specific_methods(self): - """Test Site methods using English specific inputs and outputs.""" - mysite = self.get_site() - if mysite.lang != 'en': - self.skipTest( - f'English-specific tests not valid on {mysite}') - - self.assertEqual(mysite.months_names[4], ('May', 'May')) - self.assertEqual(mysite.list_to_text(('Pride', 'Prejudice')), - 'Pride and Prejudice') - self.assertEqual(mysite.list_to_text(('This', 'that', 'the other')), - 'This, that and the other') - - def test_page_methods(self): - """Test ApiSite methods for getting page-specific info.""" - mysite = self.get_site() - mainpage = self.get_mainpage() - self.assertIsInstance(mysite.page_restrictions(mainpage), dict) - self.assertIsInstance(mysite.page_can_be_edited(mainpage), bool) - self.assertIsInstance(mysite.page_isredirect(mainpage), bool) - if mysite.page_isredirect(mainpage): - self.assertIsInstance(mysite.getredirtarget(mainpage), - pywikibot.Page) - else: - with self.assertRaises(IsNotRedirectPageError): - mysite.getredirtarget(mainpage) - a = list(mysite.preloadpages([mainpage])) - self.assertLength(a, int(mainpage.exists())) - if a: - self.assertEqual(a[0], mainpage) - - -class TestLockingPage(DefaultSiteTestCase): - """Test cases for lock/unlock a page within threads.""" - - cached = True - - def worker(self): - """Lock a page, wait few seconds and unlock the page.""" - page = pywikibot.Page(self.site, 'Foo') - page.site.lock_page(page=page, block=True) - wait = random.randint(1, 25) / 10 - time.sleep(wait) - page.site.unlock_page(page=page) - - def test_threads_locking_page(self): - """Test lock_page and unlock_page methods for multiple threads.""" - # Start few threads - threads = [] - for _ in range(5): - thread = threading.Thread(target=self.worker, daemon=True) - thread.start() - threads.append(thread) - - for thread in threads: - thread.join(15) # maximum wait time for all threads - - with self.subTest(name=thread.name): - # Check whether a timeout happened. - # In that case is_alive() is True - self.assertFalse(thread.is_alive(), - 'test page is still locked') - - def test_lock_page(self): - """Test the site.lock_page() and site.unlock_page() method.""" - site = self.get_site() - p1 = pywikibot.Page(site, 'Foo') - - site.lock_page(page=p1, block=True) - with self.assertRaises(PageInUseError): - site.lock_page(page=p1, block=False) - site.unlock_page(page=p1) - # verify it's unlocked - site.lock_page(page=p1, block=False) - site.unlock_page(page=p1) - - -class SiteUserTestCase(DefaultSiteTestCase, DeprecationTestCase): - - """Test site method using a user.""" - - login = True - - def test_methods(self): - """Test user related methods.""" - mysite = self.get_site() - self.assertIsInstance(mysite.is_blocked(), bool) - self.assertIsInstance(mysite.has_right('edit'), bool) - self.assertFalse(mysite.has_right('nonexistent_right')) - self.assertIsInstance(mysite.has_group('bots'), bool) - self.assertFalse(mysite.has_group('nonexistent_group')) - for grp in ('user', 'autoconfirmed', 'bot', 'sysop', 'nosuchgroup'): - self.assertIsInstance(mysite.has_group(grp), bool) - for rgt in ('read', 'edit', 'move', 'delete', 'rollback', 'block', - 'nosuchright'): - self.assertIsInstance(mysite.has_right(rgt), bool) - - def test_deprected_methods(self): - """Test deprecated user related methods.""" - mysite = self.get_site() - self.assertIsInstance(mysite.messages(), bool) - self.assertOneDeprecation() - - def test_logevents(self): - """Test the site.logevents() method.""" - mysite = self.get_site() - for entry in mysite.logevents(user=mysite.user(), total=3): - self.assertEqual(entry.user(), mysite.user()) - - -class SiteSysopTestCase(DefaultSiteTestCase): - - """Test site method using a sysop account.""" - - rights = 'delete' - - def test_methods(self): - """Test sysop related methods.""" - mysite = self.get_site() - self.assertIsInstance(mysite.is_blocked(), bool) - self.assertIsInstance(mysite.has_right('edit'), bool) - self.assertFalse(mysite.has_right('nonexistent_right')) - self.assertIsInstance(mysite.has_group('bots'), bool) - self.assertFalse(mysite.has_group('nonexistent_group')) - self.assertTrue(mysite.has_right(self.rights)) - - def test_deletedrevs(self): - """Test the site.deletedrevs() method.""" - mysite = self.get_site() - if not mysite.has_right('deletedhistory'): - self.skipTest( - "You don't have permission to view the deleted revisions " - 'on {}.'.format(mysite)) - mainpage = self.get_mainpage() - gen = mysite.deletedrevs(total=10, titles=mainpage) - - for dr in gen: - break - else: - self.skipTest( - f'{mainpage} contains no deleted revisions.') - self.assertLessEqual(len(dr['revisions']), 10) - for rev in dr['revisions']: - self.assertIsInstance(rev, dict) - - with self.subTest(start='2008-10-11T01:02:03Z', reverse=False): - for item in mysite.deletedrevs(start='2008-10-11T01:02:03Z', - titles=mainpage, total=5): - for rev in item['revisions']: - self.assertIsInstance(rev, dict) - self.assertLessEqual(rev['timestamp'], - '2008-10-11T01:02:03Z') - - with self.subTest(end='2008-04-01T02:03:04Z', reverse=False): - for item in mysite.deletedrevs(end='2008-04-01T02:03:04Z', - titles=mainpage, total=5): - for rev in item['revisions']: - self.assertIsInstance(rev, dict) - self.assertGreaterEqual(rev['timestamp'], - '2008-10-11T02:03:04Z') - - with self.subTest(start='2008-10-11T03:05:07Z', reverse=True): - for item in mysite.deletedrevs(start='2008-10-11T03:05:07Z', - titles=mainpage, total=5, - reverse=True): - for rev in item['revisions']: - self.assertIsInstance(rev, dict) - self.assertGreaterEqual(rev['timestamp'], - '2008-10-11T03:05:07Z') - - with self.subTest(end='2008-10-11T04:06:08Z', reverse=True): - for item in mysite.deletedrevs(end='2008-10-11T04:06:08Z', - titles=mainpage, total=5, - reverse=True): - for rev in item['revisions']: - self.assertIsInstance(rev, dict) - self.assertLessEqual(rev['timestamp'], - '2008-10-11T04:06:08Z') - - with self.subTest(start='2008-10-13T11:59:59Z', - end='2008-10-13T00:00:01Z', - reverse=False): - for item in mysite.deletedrevs(start='2008-10-13T11:59:59Z', - end='2008-10-13T00:00:01Z', - titles=mainpage, total=5): - for rev in item['revisions']: - self.assertIsInstance(rev, dict) - self.assertLessEqual(rev['timestamp'], - '2008-10-13T11:59:59Z') - self.assertGreaterEqual(rev['timestamp'], - '2008-10-13T00:00:01Z') - - with self.subTest(start='2008-10-15T06:00:01Z', - end='2008-10-15T23:59:59Z', - reverse=True): - for item in mysite.deletedrevs(start='2008-10-15T06:00:01Z', - end='2008-10-15T23:59:59Z', - titles=mainpage, total=5, - reverse=True): - for rev in item['revisions']: - self.assertIsInstance(rev, dict) - self.assertLessEqual(rev['timestamp'], - '2008-10-15T23:59:59Z') - self.assertGreaterEqual(rev['timestamp'], - '2008-10-15T06:00:01Z') - - # start earlier than end - with self.subTest(start='2008-09-03T00:00:01Z', - end='2008-09-03T23:59:59Z', - reverse=False), self.assertRaises(AssertionError): - gen = mysite.deletedrevs(titles=mainpage, - start='2008-09-03T00:00:01Z', - end='2008-09-03T23:59:59Z', total=5) - next(gen) - - # reverse: end earlier than start - with self.subTest(start='2008-09-03T23:59:59Z', - end='2008-09-03T00:00:01Z', - reverse=True), self.assertRaises(AssertionError): - gen = mysite.deletedrevs(titles=mainpage, - start='2008-09-03T23:59:59Z', - end='2008-09-03T00:00:01Z', total=5, - reverse=True) - next(gen) - - def test_alldeletedrevisions(self): - """Test the site.alldeletedrevisions() method.""" - mysite = self.get_site() - myuser = mysite.user() - if not mysite.has_right('deletedhistory'): - self.skipTest( - "You don't have permission to view the deleted revisions " - 'on {}.'.format(mysite)) - prop = ['ids', 'timestamp', 'flags', 'user', 'comment'] - gen = mysite.alldeletedrevisions(total=10, prop=prop) - - for data in gen: - break - else: - self.skipTest(f'{myuser} does not have deleted edits.') - self.assertIn('revisions', data) - for drev in data['revisions']: - for key in ('revid', 'timestamp', 'user', 'comment'): - self.assertIn(key, drev) - - with self.subTest(start='2008-10-11T01:02:03Z', reverse=False, - prop=prop): - for item in mysite.alldeletedrevisions( - start='2008-10-11T01:02:03Z', - total=5 - ): - for drev in item['revisions']: - self.assertIsInstance(drev, dict) - self.assertLessEqual(drev['timestamp'], - '2008-10-11T01:02:03Z') - - with self.subTest(start='2008-10-11T01:02:03Z', reverse=True, - prop=prop): - for item in mysite.alldeletedrevisions( - start='2008-10-11T01:02:03Z', - total=5 - ): - for drev in item['revisions']: - self.assertIsInstance(drev, dict) - self.assertGreaterEqual(drev['timestamp'], - '2008-10-11T01:02:03Z') - - # start earlier than end - with self.subTest(start='2008-09-03T00:00:01Z', - end='2008-09-03T23:59:59Z', - reverse=False, - prop=prop), self.assertRaises(AssertionError): - gen = mysite.alldeletedrevisions(start='2008-09-03T00:00:01Z', - end='2008-09-03T23:59:59Z', - total=5) - next(gen) - - # reverse: end earlier than start - with self.subTest(start='2008-09-03T23:59:59Z', - end='2008-09-03T00:00:01Z', - reverse=True, - prop=prop), self.assertRaises(AssertionError): - gen = mysite.alldeletedrevisions(start='2008-09-03T23:59:59Z', - end='2008-09-03T00:00:01Z', - total=5, reverse=True) - next(gen) - - -class TestSiteSysopWrite(TestCase): - - """Test site methods that require writing rights.""" - - family = 'wikipedia' - code = 'test' - - write = True - rights = 'delete,deleterevision,protect' - - def test_protect(self): - """Test the site.protect() method.""" - site = self.get_site() - p1 = pywikibot.Page(site, 'User:Unicodesnowman/ProtectTest') - - r = site.protect(protections={'edit': 'sysop', - 'move': 'autoconfirmed'}, - page=p1, - reason='Pywikibot unit test') - self.assertIsNone(r) - self.assertEqual(site.page_restrictions(page=p1), - {'edit': ('sysop', 'infinity'), - 'move': ('autoconfirmed', 'infinity')}) - - expiry = pywikibot.Timestamp.fromISOformat('2050-01-01T00:00:00Z') - site.protect(protections={'edit': 'sysop', 'move': 'autoconfirmed'}, - page=p1, - expiry=expiry, - reason='Pywikibot unit test') - - self.assertEqual(site.page_restrictions(page=p1), - {'edit': ('sysop', '2050-01-01T00:00:00Z'), - 'move': ('autoconfirmed', '2050-01-01T00:00:00Z')}) - - site.protect(protections={'edit': '', 'move': ''}, - page=p1, - reason='Pywikibot unit test') - self.assertEqual(site.page_restrictions(page=p1), {}) - - def test_protect_alt(self): - """Test the site.protect() method, works around T78522.""" - site = self.get_site() - p1 = pywikibot.Page(site, 'User:Unicodesnowman/ProtectTest') - - r = site.protect(protections={'edit': 'sysop', - 'move': 'autoconfirmed'}, - page=p1, - reason='Pywikibot unit test') - self.assertIsNone(r) - self.assertEqual(site.page_restrictions(page=p1), - {'edit': ('sysop', 'infinity'), - 'move': ('autoconfirmed', 'infinity')}) - - p1 = pywikibot.Page(site, 'User:Unicodesnowman/ProtectTest') - expiry = pywikibot.Timestamp.fromISOformat('2050-01-01T00:00:00Z') - site.protect(protections={'edit': 'sysop', 'move': 'autoconfirmed'}, - page=p1, - expiry=expiry, - reason='Pywikibot unit test') - - self.assertEqual(site.page_restrictions(page=p1), - {'edit': ('sysop', '2050-01-01T00:00:00Z'), - 'move': ('autoconfirmed', '2050-01-01T00:00:00Z')}) - - p1 = pywikibot.Page(site, 'User:Unicodesnowman/ProtectTest') - site.protect(protections={'edit': '', 'move': ''}, - page=p1, - reason='Pywikibot unit test') - self.assertEqual(site.page_restrictions(page=p1), {}) - - def test_protect_exception(self): - """Test that site.protect() throws an exception for invalid args.""" - site = self.get_site() - p1 = pywikibot.Page(site, 'User:Unicodesnowman/ProtectTest') - with self.assertRaises(AssertionError): - site.protect(protections={'anInvalidValue': 'sysop'}, - page=p1, reason='Pywikibot unit test') - with self.assertRaises(AssertionError): - site.protect(protections={'edit': 'anInvalidValue'}, - page=p1, reason='Pywikibot unit test') - - def test_delete(self): - """Test the site.delete() and site.undelete() methods.""" - site = self.get_site() - p = pywikibot.Page(site, 'User:Unicodesnowman/DeleteTestSite') - # Verify state - if not p.exists(): - site.undelete(p, 'pywikibot unit tests') - - site.delete(p, reason='pywikibot unit tests') - with self.assertRaises(NoPageError): - p.get(force=True) - - site.undelete(p, 'pywikibot unit tests', - revisions=['2014-12-21T06:07:47Z', - '2014-12-21T06:07:31Z']) - - revs = list(p.revisions()) - self.assertLength(revs, 2) - self.assertEqual(revs[0].revid, 219995) - self.assertEqual(revs[1].revid, 219994) - - site.delete(p, reason='pywikibot unit tests') - site.undelete(p, 'pywikibot unit tests') - revs = list(p.revisions()) - self.assertGreater(len(revs), 2) - - def test_revdel_page(self): - """Test deleting and undeleting page revisions.""" - site = self.get_site() - # Verify state - site.deleterevs('revision', ids=[219993, 219994], hide='', - show='content|comment|user', - reason='pywikibot unit tests') - - # Single revision - site.deleterevs('revision', '219994', hide='user', - reason='pywikibot unit tests') - - p1 = pywikibot.Page(site, 'User:Unicodesnowman/DeleteTestSite') - revs = list(p1.revisions()) - for rev in revs: - if rev['revid'] != 219994: - continue - self.assertTrue(rev['userhidden']) - - # Multiple revisions - site.deleterevs('revision', '219993|219994', hide='comment', - reason='pywikibot unit tests') - - p2 = pywikibot.Page(site, 'User:Unicodesnowman/DeleteTestSite') - revs = list(p2.revisions()) - for rev in revs: - if rev['revid'] != 219994: - continue - self.assertTrue(rev['userhidden']) - self.assertTrue(rev['commenthidden']) - - # Concurrently show and hide - site.deleterevs('revision', ['219993', '219994'], hide='user|content', - show='comment', reason='pywikibot unit tests') - - p3 = pywikibot.Page(site, 'User:Unicodesnowman/DeleteTestSite') - revs = list(p3.revisions()) - for rev in revs: - if rev['revid'] == 219993: - self.assertTrue(rev['userhidden']) - elif rev['revid'] == 219994: - self.assertFalse(rev['commenthidden']) - - # Cleanup - site.deleterevs('revision', [219993, 219994], - show='content|comment|user', - reason='pywikibot unit tests') - - def test_revdel_file(self): - """Test deleting and undeleting file revisions.""" - site = pywikibot.Site('test') - - # Verify state - site.deleterevs('oldimage', [20210314184415, 20210314184430], - show='content|comment|user', - reason='pywikibot unit tests', - target='File:T276726.png') - - # Single revision - site.deleterevs('oldimage', '20210314184415', hide='user', show='', - reason='pywikibot unit tests', - target='File:T276726.png') - - ts1 = pywikibot.Timestamp(2021, 3, 14, 18, 43, 57) - ts2 = pywikibot.Timestamp(2021, 3, 14, 18, 44, 17) - - fp1 = pywikibot.FilePage(site, 'File:T276726.png') - site.loadimageinfo(fp1, history=True) - for v in fp1._file_revisions.values(): - if v['timestamp'] == ts1: - self.assertTrue(hasattr(v, 'userhidden')) - - # Multiple revisions - site.deleterevs('oldimage', '20210314184415|20210314184430', - hide='comment', reason='pywikibot unit tests', - target='File:T276726.png') - - fp2 = pywikibot.FilePage(site, 'File:T276726.png') - site.loadimageinfo(fp2, history=True) - for idx, v in fp2._file_revisions.items(): - if v['timestamp'] in (ts1, ts2): - self.assertTrue(hasattr(v, 'commenthidden')) - - # Concurrently show and hide - site.deleterevs('oldimage', ['20210314184415', '20210314184430'], - hide='user|content', show='comment', - reason='pywikibot unit tests', - target='File:T276726.png') - - fp3 = pywikibot.FilePage(site, 'File:T276726.png') - site.loadimageinfo(fp3, history=True) - for idx, v in fp3._file_revisions.items(): - if v['timestamp'] in (ts1, ts2): - self.assertFalse(hasattr(v, 'commenthidden')) - self.assertFalse(hasattr(v, 'userhidden')) - self.assertFalse(hasattr(v, 'filehidden')) - - # Cleanup - site.deleterevs('oldimage', [20210314184415, 20210314184430], - show='content|comment|user', - reason='pywikibot unit tests', - target='File:T276726.png') - - def test_delete_oldimage(self): - """Test deleting and undeleting specific versions of files.""" - site = self.get_site() - fp = pywikibot.FilePage(site, 'File:T276725.png') - - # Verify state - gen = site.filearchive(start='T276725.png', end='T276725.pngg') - fileid = None - - for filearchive in gen: - fileid = filearchive['id'] - break - - if fileid is not None: - site.undelete(fp, 'pywikibot unit tests', fileids=[fileid]) - - # Delete the older version of file - hist = fp.get_file_history() - ts = pywikibot.Timestamp(2021, 3, 8, 2, 38, 57) - oldimageid = hist[ts]['archivename'] - - site.delete(fp, 'pywikibot unit tests', oldimage=oldimageid) - - # Undelete the older revision of file - gen = site.filearchive(start='T276725.png', end='T276725.pngg') - fileid = None - - for filearchive in gen: - fileid = filearchive['id'] - break - - self.assertIsNotNone(fileid) - - site.undelete(fp, 'pywikibot unit tests', fileids=[fileid]) - - -class TestUsernameInUsers(DefaultSiteTestCase): - - """Test that the user account can be found in users list.""" - - login = True - cached = True - - def test_username_in_users(self): - """Test the site.users() method with bot username.""" - mysite = self.get_site() - us = list(mysite.users(mysite.user())) - self.assertLength(us, 1) - self.assertIsInstance(us[0], dict) - - -class TestSiteExtensions(WikimediaDefaultSiteTestCase): - - """Test cases for Site extensions.""" - - cached = True - - def test_extensions(self): - """Test Extensions.""" - mysite = self.get_site() - # test automatically getting extensions cache - if 'extensions' in mysite.siteinfo: - del mysite.siteinfo._cache['extensions'] - self.assertTrue(mysite.has_extension('Disambiguator')) - - # test case-sensitivity - self.assertFalse(mysite.has_extension('disambiguator')) - - self.assertFalse(mysite.has_extension('ThisExtensionDoesNotExist')) - - -class TestSiteLoadRevisionsCaching(BasePageLoadRevisionsCachingTestBase, - DefaultSiteTestCase): - - """Test site.loadrevisions() caching.""" - - def setUp(self): - """Setup tests.""" - self._page = self.get_mainpage(force=True) - super().setUp() - - def test_page_text(self): - """Test site.loadrevisions() with Page.text.""" - self._test_page_text() - - -class TestCommonsSite(TestCase): - - """Test cases for Site methods on Commons.""" - - family = 'commons' - code = 'commons' - - cached = True - - def test_interwiki_forward(self): - """Test interwiki forward.""" - self.site = self.get_site() - self.mainpage = pywikibot.Page(pywikibot.Link('Main Page', self.site)) - # test pagelanglinks on commons, - # which forwards interwikis to wikipedia - ll = next(self.site.pagelanglinks(self.mainpage)) - self.assertIsInstance(ll, pywikibot.Link) - self.assertEqual(ll.site.family.name, 'wikipedia') - - -class TestWiktionarySite(TestCase): - - """Test Site Object on English Wiktionary.""" - - family = 'wiktionary' - code = 'en' - - cached = True - - def test_namespace_case(self): - """Test namespace case.""" - site = self.get_site() - - main_namespace = site.namespaces[0] - self.assertEqual(main_namespace.case, 'case-sensitive') - user_namespace = site.namespaces[2] - self.assertEqual(user_namespace.case, 'first-letter') - - -class TestNonEnglishWikipediaSite(TestCase): - - """Test Site Object on Nynorsk Wikipedia.""" - - family = 'wikipedia' - code = 'nn' - - cached = True - - def test_namespace_aliases(self): - """Test namespace aliases.""" - site = self.get_site() - - namespaces = site.namespaces - image_namespace = namespaces[6] - self.assertEqual(image_namespace.custom_name, 'Fil') - self.assertEqual(image_namespace.canonical_name, 'File') - self.assertEqual(str(image_namespace), ':File:') - self.assertEqual(image_namespace.custom_prefix(), ':Fil:') - self.assertEqual(image_namespace.canonical_prefix(), ':File:') - self.assertEqual(sorted(image_namespace.aliases), ['Bilde', 'Image']) - self.assertLength(image_namespace, 4) - - self.assertIsEmpty(namespaces[1].aliases) - self.assertLength(namespaces[4].aliases, 1) - self.assertEqual(namespaces[4].aliases[0], 'WP') - self.assertIn('WP', namespaces[4]) - - -class TestUploadEnabledSite(TestCase): - - """Test Site.is_uploaddisabled.""" - - sites = { - 'wikidatatest': { - 'family': 'wikidata', - 'code': 'test', - 'disabled': True, - }, - 'wikipediatest': { - 'family': 'wikipedia', - 'code': 'test', - 'disabled': False, - } - } - - login = True - - def test_is_uploaddisabled(self, key): - """Test is_uploaddisabled().""" - site = self.get_site(key) - self.assertEqual(site.is_uploaddisabled(), self.sites[key]['disabled']) - - -class TestSametitleSite(TestCase): - - """Test APISite.sametitle on sites with known behaviour.""" - - sites = { - 'enwp': { - 'family': 'wikipedia', - 'code': 'en', - }, - 'dewp': { - 'family': 'wikipedia', - 'code': 'de', - }, - 'enwt': { - 'family': 'wiktionary', - 'code': 'en', - } - } - - def test_enwp(self): - """Test sametitle for enwp.""" - self.assertTrue(self.get_site('enwp').sametitle('Foo', 'foo')) - self.assertFalse(self.get_site('enwp').sametitle( - 'Template:Test template', 'Template:Test Template')) - - def test_dewp(self): - """Test sametitle for dewp.""" - site = self.get_site('dewp') - self.assertTrue(site.sametitle('Foo', 'foo')) - self.assertTrue(site.sametitle('Benutzer:Foo', 'User:Foo')) - self.assertTrue(site.sametitle('Benutzerin:Foo', 'User:Foo')) - self.assertTrue(site.sametitle('Benutzerin:Foo', 'Benutzer:Foo')) - - def test_enwt(self): - """Test sametitle for enwt.""" - self.assertFalse(self.get_site('enwt').sametitle('Foo', 'foo')) - - def test_general(self, code): - """Test sametitle.""" - site = self.get_site(code) - self.assertTrue(site.sametitle('File:Foo', 'Image:Foo')) - self.assertTrue(site.sametitle(':Foo', 'Foo')) - self.assertFalse(site.sametitle('User:Foo', 'Foo')) - self.assertFalse(site.sametitle('User:Foo', 'Project:Foo')) - - self.assertTrue(site.sametitle('Namespace:', 'Namespace:')) - - self.assertFalse(site.sametitle('Invalid:Foo', 'Foo')) - self.assertFalse(site.sametitle('Invalid1:Foo', 'Invalid2:Foo')) - self.assertFalse(site.sametitle('Invalid:Foo', ':Foo')) - self.assertFalse(site.sametitle('Invalid:Foo', 'Invalid:foo')) - - -class TestLinktrails(TestCase): - - """Test linktrail method.""" - - family = 'wikipedia' - code = 'test' - - def test_has_linktrail(self): - """Verify that every code has a linktrail. - - Test all smallest wikis and the others randomly. - """ - size = 20 - small_wikis = self.site.family.languages_by_size[-size:] - great_wikis = self.site.family.languages_by_size[:-size] - great_wikis = random.sample(great_wikis, size) - for code in sorted(small_wikis + great_wikis): - site = pywikibot.Site(code, self.family) - with self.subTest(site=site): - self.assertIsInstance(site.linktrail(), str) - - def test_linktrails(self): - """Test special linktrails. - - This is a subset of the old `family.linktrails` dict. - """ - linktrails = { - 'ami': '', - 'bug': '[a-z]*', - 'ca': "(?:[a-zàèéíòóúç·ïü]|'(?!'))*", - 'da': '[a-zæøå]*', - 'ext': '[a-záéíóúñ]*', - 'fa': '[ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهیآأئؤة]*', - 'gu': '[-૿]*', - 'he': '[a-zא-ת]*', - 'ii': '', - 'jv': '[a-z]*', - 'kaa': "(?:[a-zıʼ’“»]|'(?!'))*", - 'lez': '[a-zабвгдеёжзийклмнопрстуфхцчшщъыьэюяӀ]*', - 'mai': '[a-zऀ-ॣ०-꣠-ꣿ]*', - 'nds-nl': '[a-zäöüïëéèà]*', - 'or': '[a-z-]*', - 'pt': '[áâãàéêẽçíòóôõq̃úüűũa-z]*', - 'qu': '[a-záéíóúñ]*', - 'roa-rup': '[a-zăâîşţșțĂÂÎŞŢȘȚ]*', - 'sa': '[a-zऀ-ॣ०-꣠-ꣿ]*', - 'te': '[ఁ-౯]*', - 'uz': '[a-zʻʼ“»]*', - 'vec': '[a-zàéèíîìóòúù]*', - 'wuu': '', - 'xmf': '[a-zაბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰ“»]*', - 'yi': '[a-zא-ת]*', - 'zh-cn': '' - } - for code, linktrail in linktrails.items(): - site = pywikibot.Site(code, self.family) - with self.subTest(site=site): - self.assertEqual(site.linktrail(), linktrail) +from tests.aspects import DefaultSiteTestCase
class TestObsoleteSite(DefaultSiteTestCase): @@ -1076,279 +57,6 @@ self.assertEqual(site.ssl_hostname(), 'ja.wikipedia.org')
-class TestSingleCodeFamilySite(AlteredDefaultSiteTestCase): - - """Test single code family sites.""" - - sites = { - 'i18n': { - 'family': 'i18n', - 'code': 'i18n', - }, - } - - def test_twn(self): - """Test translatewiki.net.""" - url = 'translatewiki.net' - site = self.get_site('i18n') - self.assertEqual(site.hostname(), url) - self.assertEqual(site.code, 'i18n') - self.assertIsInstance(site.namespaces, Mapping) - self.assertFalse(site.obsolete) - self.assertEqual(site.family.hostname('en'), url) - self.assertEqual(site.family.hostname('i18n'), url) - self.assertEqual(site.family.hostname('translatewiki'), url) - - -class TestSubdomainFamilySite(TestCase): - - """Test subdomain family site.""" - - code = 'en' - family = 'wowwiki' - - def test_wow(self): - """Test wowwiki.fandom.com.""" - url = 'wowwiki-archive.fandom.com' - site = self.site - self.assertEqual(site.hostname(), url) - self.assertEqual(site.code, 'en') - self.assertIsInstance(site.namespaces, Mapping) - self.assertFalse(site.obsolete) - self.assertEqual(site.family.hostname('en'), url) - - with self.assertRaises(KeyError): - site.family.hostname('wow') - with self.assertRaises(KeyError): - site.family.hostname('wowwiki') - with self.assertRaises(UnknownSiteError): - pywikibot.Site('wowwiki') - with self.assertRaises(UnknownSiteError): - pywikibot.Site('ceb', 'wowwiki') - - -class TestProductionAndTestSite(AlteredDefaultSiteTestCase): - - """Test site without other production sites in its family.""" - - sites = { - 'commons': { - 'family': 'commons', - 'code': 'commons', - }, - 'beta': { - 'family': 'commons', - 'code': 'beta', - }, - 'wikidata': { - 'family': 'wikidata', - 'code': 'wikidata', - }, - 'wikidatatest': { - 'family': 'wikidata', - 'code': 'test', - }, - } - - 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, Mapping) - self.assertFalse(site.obsolete) - - with self.assertRaises(KeyError): - site.family.hostname('en') - - pywikibot.config.family = 'commons' - pywikibot.config.mylang = 'de' - - site2 = pywikibot.Site('beta') - self.assertEqual(site2.hostname(), - 'commons.wikimedia.beta.wmflabs.org') - self.assertEqual(site2.code, 'beta') - self.assertFalse(site2.obsolete) - - with self.assertRaises(UnknownSiteError): - pywikibot.Site() - - 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, Mapping) - self.assertFalse(site.obsolete) - - with 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 can't be used due to T71255 - with self.assertRaises(UnknownSiteError): - pywikibot.Site('en', 'wikidata') - - -class TestSiteProofreadinfo(DefaultSiteTestCase): - - """Test proofreadinfo information.""" - - sites = { - 'en-ws': { - 'family': 'wikisource', - 'code': 'en', - }, - 'en-wp': { - 'family': 'wikipedia', - 'code': 'en', - }, - } - - cached = True - - def test_cache_proofreadinfo_on_site_with_proofreadpage(self): - """Test Site._cache_proofreadinfo().""" - site = self.get_site('en-ws') - ql_res = {0: 'Without text', 1: 'Not proofread', 2: 'Problematic', - 3: 'Proofread', 4: 'Validated'} - - site._cache_proofreadinfo() - self.assertEqual(site.namespaces[106], site.proofread_index_ns) - self.assertEqual(site.namespaces[104], site.proofread_page_ns) - self.assertEqual(site.proofread_levels, ql_res) - self.assertEqual(site.namespaces[106], site.proofread_index_ns) - del site._proofread_page_ns # Check that property reloads. - self.assertEqual(site.namespaces[104], site.proofread_page_ns) - - def test_cache_proofreadinfo_on_site_without_proofreadpage(self): - """Test Site._cache_proofreadinfo().""" - site = self.get_site('en-wp') - with self.assertRaises(UnknownExtensionError): - site._cache_proofreadinfo() - with self.assertRaises(UnknownExtensionError): - site.proofread_index_ns - with self.assertRaises(UnknownExtensionError): - site.proofread_page_ns - with self.assertRaises(UnknownExtensionError): - site.proofread_levels - - -class TestPropertyNames(DefaultSiteTestCase): - - """Test Special:PagesWithProp method.""" - - sites = { - 'en-ws': { - 'family': 'wikisource', - 'code': 'en', - }, - 'de-wp': { - 'family': 'wikipedia', - 'code': 'de', - }, - } - - cached = True - - def test_get_property_names(self, key): - """Test get_property_names method.""" - mysite = self.get_site(key) - pnames = mysite.get_property_names() - self.assertIsInstance(pnames, list) - for item in ('defaultsort', 'disambiguation', 'displaytitle', - 'expectunusedcategory', 'forcetoc', 'hiddencat', 'index', - 'jsonconfig_getdata', 'newsectionlink', 'noeditsection', - 'nogallery', 'noindex', 'nonewsectionlink', 'notoc', - 'score', 'templatedata', 'unexpectedUnconnectedPage', - 'wikibase-badge-Q17437796', 'wikibase-badge-Q17437798', - 'wikibase-badge-Q70894304', 'wikibase_item'): - with self.subTest(item=item): - self.assertIn(item, pnames) - - -class TestPageFromWikibase(DefaultSiteTestCase): - - """Test page_from_repository method.""" - - sites = { - 'it-wb': { - 'family': 'wikibooks', - 'code': 'it', - 'result': 'Hello world', - }, - 'de-wp': { - 'family': 'wikipedia', - 'code': 'de', - 'result': 'Hallo-Welt-Programm', - }, - 'en-wp': { - 'family': 'wikipedia', - 'code': 'en', - 'result': '"Hello, World!" program', - }, - } - - ITEM = 'Q131303' - - def test_page_from_repository(self, key): - """Validate page_from_repository.""" - site = self.get_site(key) - page = site.page_from_repository(self.ITEM) - self.assertIsInstance(page, pywikibot.Page) - self.assertEqual(page.title(), self.sites[key]['result']) - - def test_page_from_repository_none(self): - """Validate page_from_repository return NoneType.""" - site = pywikibot.Site('pdc', 'wikipedia') - page = site.page_from_repository(self.ITEM) - self.assertIsNone(page) - - -class TestCategoryFromWikibase(DefaultSiteTestCase): - - """Test page_from_repository method.""" - - sites = { - 'it-ws': { - 'family': 'wikisource', - 'code': 'it', - 'result': 'Categoria:2016', - }, - 'de-wp': { - 'family': 'wikipedia', - 'code': 'de', - 'result': 'Kategorie:2016', - }, - 'en-wp': { - 'family': 'wikipedia', - 'code': 'en', - 'result': 'Category:2016', - }, - } - - ITEM = 'Q6939656' - - def test_page_from_repository(self, key): - """Validate page_from_repository.""" - site = self.get_site(key) - page = site.page_from_repository(self.ITEM) - self.assertIsInstance(page, pywikibot.Category) - self.assertEqual(page.title(), self.sites[key]['result']) - - def test_page_from_repository_none(self): - """Validate page_from_repository return NoneType.""" - site = pywikibot.Site('pdc', 'wikipedia') - page = site.page_from_repository(self.ITEM) - self.assertIsNone(page) - - if __name__ == '__main__': # pragma: no cover with suppress(SystemExit): unittest.main() diff --git a/tests/site__tests.py b/tests/site_tests.py similarity index 96% rename from tests/site__tests.py rename to tests/site_tests.py index d3f4847..eba5001 100755 --- a/tests/site__tests.py +++ b/tests/site_tests.py @@ -12,11 +12,9 @@ import unittest from collections.abc import Iterable, Mapping from contextlib import suppress -from http import HTTPStatus
import pywikibot from pywikibot import config -from pywikibot.comms import http from pywikibot.exceptions import ( IsNotRedirectPageError, NoPageError, @@ -24,8 +22,7 @@ UnknownExtensionError, UnknownSiteError, ) -from pywikibot.tools import suppress_warnings -from tests import WARN_SITE_CODE + from tests.aspects import ( AlteredDefaultSiteTestCase, DefaultDrySiteTestCase, @@ -1036,46 +1033,6 @@ self.assertEqual(site.linktrail(), linktrail)
-class TestObsoleteSite(DefaultSiteTestCase): - - """Test 'closed' and obsolete code sites.""" - - def test_locked_site(self): - """Test Wikimedia closed/locked site.""" - with suppress_warnings('Interwiki removal mh is in wikipedia codes'): - site = pywikibot.Site('mh', 'wikipedia') - self.assertIsInstance(site, pywikibot.site.ClosedSite) - self.assertEqual(site.code, 'mh') - self.assertIsInstance(site.obsolete, bool) - self.assertTrue(site.obsolete) - self.assertEqual(site.hostname(), 'mh.wikipedia.org') - r = http.fetch('http://mh.wikipedia.org/w/api.php', - default_error_handling=False) - self.assertEqual(r.status_code, HTTPStatus.OK.value) - self.assertEqual(site.siteinfo['lang'], 'mh') - - def test_removed_site(self): - """Test Wikimedia offline site.""" - site = pywikibot.Site('ru-sib', 'wikipedia') - self.assertIsInstance(site, pywikibot.site.RemovedSite) - self.assertEqual(site.code, 'ru-sib') - self.assertIsInstance(site.obsolete, bool) - self.assertTrue(site.obsolete) - with 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.""" - with suppress_warnings(WARN_SITE_CODE, category=UserWarning): - site = pywikibot.Site('jp', 'wikipedia') - 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 single code family sites."""
pywikibot-commits@lists.wikimedia.org