jenkins-bot has submitted this change. (
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/700113 )
Change subject: [IMPR] Simplify and test add_text's skip_page() method
......................................................................
[IMPR] Simplify and test add_text's skip_page() method
JJMC89 reverted commit 2d9d42d3 due to T285015. This adds test coverage and
takes another run at simplifying this method.
Bug: T285015
Change-Id: I8cac6221148ddb3ea55850242ed773c205a908da
---
M scripts/add_text.py
M tests/add_text_tests.py
2 files changed, 82 insertions(+), 14 deletions(-)
Approvals:
Xqt: Looks good to me, approved
jenkins-bot: Verified
diff --git a/scripts/add_text.py b/scripts/add_text.py
index 9f23df4..dd54b72 100755
--- a/scripts/add_text.py
+++ b/scripts/add_text.py
@@ -63,7 +63,11 @@
from pywikibot import config, i18n, pagegenerators, textlib
from pywikibot.backports import Dict, Tuple
-from pywikibot.bot import AutomaticTWSummaryBot, NoRedirectPageBot
+from pywikibot.bot import (
+ AutomaticTWSummaryBot,
+ ExistingPageBot,
+ NoRedirectPageBot,
+)
from pywikibot.bot_choice import QuitKeyboardInterrupt
from pywikibot.exceptions import (
EditConflictError,
@@ -297,7 +301,7 @@
error_count += 1
-class AddTextBot(AutomaticTWSummaryBot, NoRedirectPageBot):
+class AddTextBot(AutomaticTWSummaryBot, ExistingPageBot, NoRedirectPageBot):
"""A bot which adds a text to a page."""
@@ -329,25 +333,21 @@
def skip_page(self, page):
"""Skip if -exceptUrl matches or page does not
exists."""
- if not page.exists():
- if not page.isTalkPage():
- pywikibot.warning('Page {page} does not exist on {page.site}.'
- .format(page=page))
- return True
- elif self.opt.regex_skip_url:
+ if page.exists() and self.opt.regex_skip_url:
url = page.full_url()
result = re.findall(self.opt.regex_skip_url, page.site.getUrl(url))
+
if result:
pywikibot.warning(
- 'Regex (or word) used with -exceptUrl is in the page. '
- 'Skipping {page}\nMatch was: {result}'
+ 'Skipping {page} because -excepturl matches {result}.'
.format(page=page, result=result))
return True
- skipping = super().skip_page(page)
- if not skipping and not page.exists():
+ if page.isTalkPage() and not page.exists():
pywikibot.output("{} doesn't exist, creating
it!".format(page))
- return skipping
+ return False
+
+ return super().skip_page(page)
def treat_page(self):
"""Add text to the page."""
diff --git a/tests/add_text_tests.py b/tests/add_text_tests.py
index e8932c7..90f05b0 100644
--- a/tests/add_text_tests.py
+++ b/tests/add_text_tests.py
@@ -5,7 +5,7 @@
# Distributed under the terms of the MIT license.
#
import unittest
-from unittest.mock import ANY, Mock, mock_open, patch
+from unittest.mock import ANY, MagicMock, Mock, mock_open, patch
import pywikibot
import pywikibot.pagegenerators
@@ -15,6 +15,21 @@
from tests.aspects import TestCase
+def _mock_page(exists=True, redirect=False, talk=False, url='wikipedia.org'):
+ """Provides a page with these attributes."""
+ page = MagicMock()
+
+ page.exists.return_value = exists
+ page.isRedirectPage.return_value = redirect
+ page.isTalkPage.return_value = talk
+ page.site.getUrl.return_value = url
+
+ page.__str__.return_value = 'mock_page'
+ page.site.__str__.return_value = 'mock_site'
+
+ return page
+
+
class TestAdding(TestCase):
"""Test adding text."""
@@ -27,6 +42,7 @@
def setUp(self):
"""Setup test."""
super().setUp()
+ pywikibot.bot.ui.clear()
self.generator_factory = pywikibot.pagegenerators.GeneratorFactory()
@patch('pywikibot.handle_args', Mock(side_effect=lambda args: args))
@@ -132,6 +148,58 @@
mock_file.assert_called_with('/path/to/my/file.txt', 'rb', ANY)
+ def test_not_skipped(self):
+ """Exercise skip_page() with a page we should
accept."""
+ bot = AddTextBot()
+ page = _mock_page()
+
+ self.assertFalse(bot.skip_page(page))
+ self.assertEqual([], pywikibot.bot.ui.pop_output())
+
+ def test_skip_missing_standard(self):
+ """Exercise skip_page() with a non-talk page that doesn't
exist."""
+ bot = AddTextBot()
+ page = _mock_page(exists=False)
+
+ self.assertTrue(bot.skip_page(page))
+ self.assertEqual([
+ 'Page mock_page does not exist on mock_site.'
+ ], pywikibot.bot.ui.pop_output())
+
+ def test_skip_missing_talk(self):
+ """Exercise skip_page() with a talk page that doesn't
exist."""
+ bot = AddTextBot()
+ page = _mock_page(exists=False, talk=True)
+
+ self.assertFalse(bot.skip_page(page))
+ self.assertEqual([
+ "mock_page doesn't exist, creating it!"
+ ], pywikibot.bot.ui.pop_output())
+
+ def test_skip_if_redirect(self):
+ """Exercise skip_page() with a page that is a
redirect."""
+ bot = AddTextBot()
+ page = _mock_page(redirect=True)
+
+ self.assertTrue(bot.skip_page(page))
+ self.assertEqual([
+ 'Page mock_page on mock_site is skipped because it is a redirect'
+ ], pywikibot.bot.ui.pop_output())
+
+ def test_skip_if_url_match(self):
+ """Exercise skip_page() with a '-excepturl'
argument."""
+ bot = AddTextBot(regex_skip_url='.*\\.com')
+
+ page = _mock_page(url='wikipedia.org')
+ self.assertFalse(bot.skip_page(page))
+ self.assertEqual([], pywikibot.bot.ui.pop_output())
+
+ page = _mock_page(url='wikipedia.com')
+ self.assertTrue(bot.skip_page(page))
+ self.assertEqual([
+ "Skipping mock_page because -excepturl matches
['wikipedia.com']."
+ ], pywikibot.bot.ui.pop_output())
+
if __name__ == '__main__': # pragma: no cover
unittest.main()
--
To view, visit
https://gerrit.wikimedia.org/r/c/pywikibot/core/+/700113
To unsubscribe, or for help writing mail filters, visit
https://gerrit.wikimedia.org/r/settings
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Change-Id: I8cac6221148ddb3ea55850242ed773c205a908da
Gerrit-Change-Number: 700113
Gerrit-PatchSet: 4
Gerrit-Owner: Damian <atagar1(a)gmail.com>
Gerrit-Reviewer: D3r1ck01 <xsavitar.wiki(a)aol.com>
Gerrit-Reviewer: Xqt <info(a)gno.de>
Gerrit-Reviewer: jenkins-bot
Gerrit-MessageType: merged