jenkins-bot has submitted this change and it was merged.
Change subject: Add tests for the Category class ......................................................................
Add tests for the Category class
Move category-related tests from page_tests to the new category_tests.py, implement tests for sortKey, categoryinfo, members, subcategories and articles.
A very odd issue was found with subcategories() not returning certain subcategories: T84860
Many of the tests introduced reference specific en.wikipedia categories. They have been chosen for being the most likely to remain stable - many of them date from 2004-2005 so the risk should be low.
Bug: T78231 Change-Id: I6e42a3a0ccb9efc85abdd411ee8c35a44603dba0 --- M tests/__init__.py A tests/category_tests.py M tests/page_tests.py 3 files changed, 204 insertions(+), 25 deletions(-)
Approvals: John Vandenberg: Looks good to me, approved jenkins-bot: Verified
diff --git a/tests/__init__.py b/tests/__init__.py index cd5ef45..bd6e9c5 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -73,6 +73,7 @@ 'link', 'interwiki_link', 'page', + 'category', 'file', 'edit_failure', 'timestripper', diff --git a/tests/category_tests.py b/tests/category_tests.py new file mode 100644 index 0000000..6ba5abb --- /dev/null +++ b/tests/category_tests.py @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- +"""Tests for the Category class.""" +# +# (C) Pywikibot team, 2008-2014 +# +# Distributed under the terms of the MIT license. +# +__version__ = '$Id$' + +import pywikibot +import pywikibot.page + +from tests.aspects import unittest, TestCase +from tests.utils import allowed_failure + + +class TestCategoryObject(TestCase): + + """Test Category object.""" + + family = 'wikipedia' + code = 'en' + + cached = True + + def test_init(self): + """Test the category's __init__ for one condition that can't be dry.""" + site = self.get_site() + self.assertRaises(ValueError, pywikibot.Category, site, 'Wikipedia:Test') + + def test_is_empty(self): + """Test if category is empty or not.""" + site = self.get_site() + cat_empty = pywikibot.Category(site, 'Category:foooooo') + cat_not_empty = pywikibot.Category(site, 'Category:Wikipedia categories') + self.assertTrue(cat_empty.isEmptyCategory()) + self.assertFalse(cat_not_empty.isEmptyCategory()) + + def test_is_hidden(self): + """Test isHiddenCategory.""" + site = self.get_site() + cat_hidden = pywikibot.Category(site, 'Category:Hidden categories') + cat_not_hidden = pywikibot.Category(site, 'Category:Wikipedia categories') + self.assertTrue(cat_hidden.isHiddenCategory()) + self.assertFalse(cat_not_hidden.isHiddenCategory()) + + def test_categoryinfo(self): + """Test the categoryinfo property.""" + site = self.get_site() + cat = pywikibot.Category(site, 'Category:Female Wikipedians') + categoryinfo = cat.categoryinfo + self.assertTrue(categoryinfo['files'] >= 0) + self.assertTrue(categoryinfo['pages'] >= 0) + self.assertTrue(categoryinfo['size'] > 0) + self.assertTrue(categoryinfo['subcats'] > 0) + members_sum = categoryinfo['files'] + categoryinfo['pages'] + categoryinfo['subcats'] + self.assertEqual(members_sum, categoryinfo['size']) + + cat_files = pywikibot.Category(site, 'Category:Files lacking an author') + categoryinfo2 = cat_files.categoryinfo + self.assertTrue(categoryinfo2['files'] > 0) + + def test_members(self): + """Test the members method.""" + site = self.get_site() + cat = pywikibot.Category(site, 'Category:Wikipedia legal policies') + p1 = pywikibot.Page(site, 'Category:Wikipedia disclaimers') + p2 = pywikibot.Page(site, 'Wikipedia:Terms of use') + p3 = pywikibot.Page(site, 'Wikipedia:Risk disclaimer') + + members = list(cat.members()) + self.assertIn(p1, members) + self.assertIn(p2, members) + self.assertNotIn(p3, members) + + members_recurse = list(cat.members(recurse=True)) + self.assertIn(p1, members_recurse) + self.assertIn(p2, members_recurse) + self.assertIn(p3, members_recurse) + + members_namespace = list(cat.members(namespaces=14)) + self.assertIn(p1, members_namespace) + self.assertNotIn(p2, members_namespace) + self.assertNotIn(p3, members_namespace) + + members_total = list(cat.members(total=2)) + self.assertEqual(len(members_total), 2) + + def test_subcategories(self): + """Test the subcategories method.""" + site = self.get_site() + cat = pywikibot.Category(site, 'Category:Wikipedians by gender') + c1 = pywikibot.Category(site, 'Category:Female Wikipedians') + c2 = pywikibot.Category(site, 'Category:Lesbian Wikipedians') + + subcategories = list(cat.subcategories()) + self.assertIn(c1, subcategories) + self.assertNotIn(c2, subcategories) + + subcategories_total = list(cat.subcategories(total=2)) + self.assertEqual(len(subcategories_total), 2) + + @allowed_failure + def test_subcategories_recurse(self): + """Test the subcategories method with recurse=True.""" + # FIXME: Broken, some subcategories are missing. + # See: T84860 + site = self.get_site() + cat = pywikibot.Category(site, 'Category:Wikipedians by gender') + c1 = pywikibot.Category(site, 'Category:Female Wikipedians') + c2 = pywikibot.Category(site, 'Category:Lesbian Wikipedians') + + subcategories_recurse = list(cat.subcategories(recurse=True)) + self.assertIn(c1, subcategories_recurse) + self.assertIn(c2, subcategories_recurse) + + def test_articles(self): + """Test the articles method.""" + site = self.get_site() + cat = pywikibot.Category(site, 'Category:Wikipedia legal policies') + p1 = pywikibot.Page(site, 'Wikipedia:Terms of use') + p2 = pywikibot.Page(site, 'Wikipedia:Risk disclaimer') + + articles = list(cat.articles()) + self.assertIn(p1, articles) + self.assertNotIn(p2, articles) + + articles_recurse = list(cat.articles(recurse=True)) + self.assertIn(p1, articles_recurse) + self.assertIn(p2, articles_recurse) + + articles_namespace = list(cat.articles(namespaces=1)) + self.assertNotIn(p1, articles_namespace) + self.assertNotIn(p2, articles_namespace) + + articles_total = list(cat.articles(total=2)) + self.assertEqual(len(articles_total), 2) + + +class TestCategoryDryObject(TestCase): + + """Test the category object with dry tests.""" + + family = 'wikipedia' + code = 'en' + + dry = True + + def test_init_dry(self): + """Test the category's __init__.""" + site = self.get_site() + cat_normal = pywikibot.Category(site, 'Category:Foo') + self.assertEqual(cat_normal.title(withNamespace=False), 'Foo') + self.assertEqual(cat_normal.namespace(), 14) + + cat_missing = pywikibot.Category(site, 'Foo') + self.assertEqual(cat_missing.title(withNamespace=False), 'Foo') + self.assertEqual(cat_missing.namespace(), 14) + + cat_duplicate = pywikibot.Category(site, 'Category:Category:Foo') + self.assertEqual(cat_duplicate.title(withNamespace=False), 'Category:Foo') + self.assertEqual(cat_duplicate.namespace(), 14) + + cat_dup_ns = pywikibot.Category(site, 'Category:Wikipedia:Test') + self.assertTrue(cat_dup_ns.title(withNamespace=False), 'Page:Foo') + self.assertTrue(cat_dup_ns.namespace(), 14) + + self.assertRaises(ValueError, pywikibot.Category, site, 'Talk:Foo') + + def test_section(self): + """Test the section method.""" + site = self.get_site() + cat = pywikibot.Category(site, 'Category:Foo#bar') + self.assertEqual(cat.section(), 'bar') + cat2 = pywikibot.Category(site, 'Category:Foo') + self.assertEqual(cat2.section(), None) + + def test_aslink(self): + """Test the title method with asLink=True.""" + site = self.get_site() + cat = pywikibot.Category(site, 'Category:Wikipedia Categories') + self.assertEqual(cat.title(asLink=True, insite=cat.site), + u'[[Category:Wikipedia Categories]]') + cat_section = pywikibot.Category(site, 'Category:Wikipedia Categories#Foo') + self.assertEqual(cat_section.title(asLink=True, insite=cat_section.site), + u'[[Category:Wikipedia Categories#Foo]]') + cat_dup = pywikibot.Category(site, 'Category:Wikipedia:Test') + self.assertEqual(cat_dup.title(asLink=True, insite=cat_dup.site), + u'[[Category:Wikipedia:Test]]') + + def test_sortkey(self): + """Test the sortKey attribute.""" + site = self.get_site() + cat = pywikibot.Category(site, 'Category:Wikipedia categories', 'Example') + self.assertEqual(cat.aslink(), '[[Category:Wikipedia categories|Example]]') + self.assertEqual(cat.aslink(sortKey='Foo'), '[[Category:Wikipedia categories|Foo]]') + + +if __name__ == '__main__': + try: + unittest.main() + except SystemExit: + pass diff --git a/tests/page_tests.py b/tests/page_tests.py index ee33b56..a756d5d 100644 --- a/tests/page_tests.py +++ b/tests/page_tests.py @@ -550,31 +550,6 @@ self.assertRaises(pywikibot.exceptions.NoPage, p3.get)
-class TestCategoryObject(TestCase): - - """Test Category object.""" - - family = 'wikipedia' - code = 'en' - - cached = True - - def test_isEmptyCategory(self): - """Test if category is empty or not.""" - site = self.get_site() - cat_empty = pywikibot.Category(site, u'Category:foooooo') - cat_not_empty = pywikibot.Category(site, u'Category:Wikipedia categories') - self.assertTrue(cat_empty.isEmptyCategory()) - self.assertFalse(cat_not_empty.isEmptyCategory()) - - def test_isHiddenCategory(self): - site = self.get_site() - cat_hidden = pywikibot.Category(site, u'Category:Hidden categories') - cat_not_hidden = pywikibot.Category(site, u'Category:Wikipedia categories') - self.assertTrue(cat_hidden.isHiddenCategory()) - self.assertFalse(cat_not_hidden.isHiddenCategory()) - - class TestPageUserAction(DefaultSiteTestCase):
"""Test page user actions."""
pywikibot-commits@lists.wikimedia.org