jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/394520 )
Change subject: Change to use assertRaisesRegex in link_tests.py ...................................................................... Change to use assertRaisesRegex in link_tests.py assertRaises is not as good of a test as asserRaisesRegex. The latter has an extra parameter to match the exception message, allowing more more precision when checking an error. Also bump the Pywikibot license to 2014-2017 in `link_tests.py`. Bug: T154281 Change-Id: Ie2dd6a0e5828be51fd500a2f0a14f552a9ed917e --- M tests/link_tests.py 1 file changed, 99 insertions(+), 30 deletions(-) Approvals: John Vandenberg: Looks good to me, approved jenkins-bot: Verified diff --git a/tests/link_tests.py b/tests/link_tests.py index 8bacdc1..9fba7c1 100644 --- a/tests/link_tests.py +++ b/tests/link_tests.py @@ -1,11 +1,13 @@ # -*- coding: utf-8 -*- """Test Link functionality.""" # -# (C) Pywikibot team, 2014-2015 +# (C) Pywikibot team, 2014-2017 # # Distributed under the terms of the MIT license. # from __future__ import absolute_import, unicode_literals + +import re import pywikibot @@ -103,43 +105,104 @@ def test_invalid(self): """Test that invalid titles raise InvalidTitle exception.""" - self.assertRaises(InvalidTitle, Link('', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link(':', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('__ __', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link(' __ ', self.get_site()).parse) + exception_message_regex = ( + r'^The link does not contain a page title$' + ) + + texts_to_test = ['', ':', '__ __', ' __ '] + + for text in texts_to_test: + with self.assertRaisesRegex( + InvalidTitle, + exception_message_regex): + Link(text, self.get_site()).parse() + # Bad characters forbidden regardless of wgLegalTitleChars - self.assertRaises(InvalidTitle, Link('A [ B', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('A ] B', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('A { B', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('A } B', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('A < B', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('A > B', self.get_site()).parse) + def generate_contains_illegal_chars_exc_regex(text): + exc_regex = ( + r'^(u|)\'%s\' contains illegal char\(s\) (u|)\'%s\'$' % ( + re.escape(text), re.escape(text[2]) + )) + return exc_regex + + texts_to_test = ['A [ B', 'A ] B', 'A { B', 'A } B', 'A < B', 'A > B'] + + for text in texts_to_test: + with self.assertRaisesRegex( + InvalidTitle, + generate_contains_illegal_chars_exc_regex(text)): + Link(text, self.get_site()).parse() + # URL encoding # %XX is understood by wikimedia but not %XXXX - self.assertRaises(InvalidTitle, Link('A%2523B', self.get_site()).parse) + with self.assertRaisesRegex( + InvalidTitle, + r'^(u|)\'A%23B\' contains illegal char\(s\) (u|)\'%23\'$'): + Link('A%2523B', self.get_site()).parse() + # A link is invalid if their (non-)talk page would be in another # namespace than the link's "other" namespace - self.assertRaises(InvalidTitle, Link('Talk:File:Example.svg', self.get_site()).parse) + with self.assertRaisesRegex( + InvalidTitle, + (r'The \(non-\)talk page of (u|)\'Talk:File:Example.svg\'' + r' is a valid title in another namespace.')): + Link('Talk:File:Example.svg', self.get_site()).parse() + # Directory navigation - self.assertRaises(InvalidTitle, Link('.', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('..', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('./Sandbox', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('../Sandbox', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('Foo/./Sandbox', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('Foo/../Sandbox', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('Sandbox/.', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('Sandbox/..', self.get_site()).parse) + def generate_contains_dot_combinations_exc_regex(text): + exc_regex = ( + r'^\(contains \. / combinations\): (u|)\'%s\'$' % re.escape( + text) + ) + return exc_regex + + texts_to_test = ['.', '..', './Sandbox', '../Sandbox', 'Foo/./Sandbox', + 'Foo/../Sandbox', 'Sandbox/.', 'Sandbox/..'] + + for text in texts_to_test: + with self.assertRaisesRegex( + InvalidTitle, + generate_contains_dot_combinations_exc_regex(text)): + Link(text, self.get_site()).parse() + # Tilde - self.assertRaises(InvalidTitle, Link('A ~~~ Name', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('A ~~~~ Signature', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('A ~~~~~ Timestamp', self.get_site()).parse) + def generate_contains_tilde_exc_regex(text): + exc_regex = r'^\(contains ~~~\): (u|)\'%s\'$' % re.escape(text) + return exc_regex + + texts_to_test = ['A ~~~ Name', 'A ~~~~ Signature', 'A ~~~~~ Timestamp'] + + for text in texts_to_test: + with self.assertRaisesRegex( + InvalidTitle, + generate_contains_tilde_exc_regex(text)): + Link(text, self.get_site()).parse() + # Overlength - self.assertRaises(InvalidTitle, Link('x' * 256, self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('Invalid:' + 'X' * 248, self.get_site()).parse) + def generate_overlength_exc_regex(text): + exc_regex = r'^\(over 255 bytes\): (u|)\'%s\'$' % re.escape(text) + return exc_regex + + texts_to_test = [('x' * 256), ('Invalid:' + 'X' * 248)] + + for text in texts_to_test: + with self.assertRaisesRegex( + InvalidTitle, + generate_overlength_exc_regex(text)): + Link(text, self.get_site()).parse() + # Namespace prefix without actual title - self.assertRaises(InvalidTitle, Link('Talk:', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('Category: ', self.get_site()).parse) - self.assertRaises(InvalidTitle, Link('Category: #bar', self.get_site()).parse) + def generate_has_no_title_exc_regex(text): + exc_regex = r'^(u|)\'%s\' has no title\.$' % re.escape(text) + return exc_regex + + texts_to_test = ['Talk:', 'Category: ', 'Category: #bar'] + + for text in texts_to_test: + with self.assertRaisesRegex( + InvalidTitle, + generate_has_no_title_exc_regex(text.strip())): + Link(text, self.get_site()).parse() def test_relative(self): """Test that relative links are handled properly.""" @@ -183,7 +246,13 @@ """Test Python issue 10254 causes an exception.""" pywikibot.page.unicodedata = __import__('unicodedata') title = 'Li̍t-sṳ́' - self.assertRaises(UnicodeError, Link, title, self.site) + with self.assertRaisesRegex( + UnicodeError, + re.escape('Link(%r, %s): combining characters detected, which ' + 'are not supported by Pywikibot on Python 2.6.6. ' + 'See https://phabricator.wikimedia.org/T102461' + % (title, self.site))): + Link(title, self.site) # ---- The first set of tests are explicit links, starting with a ':'. -- To view, visit https://gerrit.wikimedia.org/r/394520 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ie2dd6a0e5828be51fd500a2f0a14f552a9ed917e Gerrit-PatchSet: 3 Gerrit-Project: pywikibot/core Gerrit-Branch: master Gerrit-Owner: Rafidaslam <rafidt...@gmail.com> Gerrit-Reviewer: John Vandenberg <jay...@gmail.com> Gerrit-Reviewer: MtDu <justin.d...@gmail.com> Gerrit-Reviewer: Rafidaslam <rafidt...@gmail.com> Gerrit-Reviewer: Zoranzoki21 <zorandori4...@gmail.com> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits