Source code for tests.user_tests

#!/usr/bin/env python3
"""Tests for the User page."""
#
# (C) Pywikibot team, 2016-2024
#
# Distributed under the terms of the MIT license.
#
from __future__ import annotations

from contextlib import suppress
from unittest.mock import patch

import pywikibot
from pywikibot import Page, Timestamp, User
from pywikibot.exceptions import AutoblockUserError
from tests.aspects import DefaultSiteTestCase, TestCase, unittest


[docs] class TestUserClass(TestCase): """Test User class.""" family = 'wikipedia' code = 'de' def _tests_unregistered_user(self, user, prop='invalid'): """Proceed user tests.""" self.assertEqual(user.title(with_ns=False), user.username) self.assertFalse(user.isRegistered()) self.assertIsNone(user.registration()) self.assertFalse(user.isEmailable()) self.assertEqual(user.gender(), 'unknown') self.assertFalse(user.is_thankable) self.assertIn(prop, user.getprops())
[docs] def test_anonymous_user(self): """Test registered user.""" user = User(self.site, '123.45.67.89') self._tests_unregistered_user(user) self.assertTrue(user.isAnonymous())
[docs] def test_unregistered_user(self): """Test unregistered user.""" user = User(self.site, 'This user name is not registered yet') self._tests_unregistered_user(user, prop='missing') self.assertFalse(user.isAnonymous())
[docs] def test_invalid_user(self): """Test invalid user.""" user = User(self.site, 'Invalid char\x9f in Name') self._tests_unregistered_user(user) self.assertFalse(user.isAnonymous())
[docs] def test_registered_user(self): """Test registered user.""" user = User(self.site, 'Xqt') self.assertEqual(user.title(with_ns=False), user.username) self.assertTrue(user.isRegistered()) self.assertFalse(user.isAnonymous()) self.assertIsInstance(user.registration(), pywikibot.Timestamp) self.assertGreater(user.editCount(), 0) self.assertFalse(user.is_blocked()) self.assertFalse(user.is_locked()) self.assertTrue(user.isEmailable()) self.assertEqual(user.gender(), 'unknown') self.assertIn('userid', user.getprops()) self.assertEqual(user.getprops()['userid'], 287832) self.assertEqual(user.pageid, 6927779) self.assertEqual(user.getUserPage(), pywikibot.Page(self.site, 'Benutzer:Xqt')) self.assertEqual(user.getUserPage(subpage='pwb'), pywikibot.Page(self.site, 'Benutzer:Xqt/pwb')) self.assertEqual(user.getUserTalkPage(), pywikibot.Page(self.site, 'Benutzer Diskussion:Xqt')) self.assertEqual(user.getUserTalkPage(subpage='pwb'), pywikibot.Page(self.site, 'Benutzer Diskussion:Xqt/pwb')) self.assertTrue(user.is_thankable) contribs = list(user.contributions(total=10)) self.assertLength(contribs, 10) for contrib in contribs: self.assertIsInstance(contrib, tuple) self.assertIsInstance(contrib[0], pywikibot.Page) self.assertIsInstance(contrib[1], int) self.assertIsInstance(contrib[2], pywikibot.Timestamp) self.assertIn('user', user.groups()) self.assertIn('edit', user.rights()) self.assertFalse(user.is_locked())
[docs] def test_registered_user_without_timestamp(self): """Test registered user when registration timestamp is None.""" user = User(self.site, 'Ulfb') self.assertTrue(user.isRegistered()) self.assertFalse(user.isAnonymous()) self.assertIsNone(user.registration()) self.assertIsNone(user.getprops()['registration']) self.assertGreater(user.editCount(), 0) self.assertEqual(user.gender(), 'male') self.assertIn('userid', user.getprops()) self.assertTrue(user.is_thankable)
[docs] def test_female_user(self): """Test female user.""" user = User(self.site, 'Catrin') self.assertTrue(user.isRegistered()) self.assertFalse(user.isAnonymous()) self.assertGreater(user.editCount(), 0) self.assertEqual(user.gender(), 'female') self.assertIn('userid', user.getprops()) self.assertTrue(user.is_thankable)
[docs] def test_bot_user(self): """Test bot user.""" user = User(self.site, 'Xqbot') self.assertIn('bot', user.groups()) self.assertFalse(user.is_thankable)
[docs] def test_autoblocked_user(self): """Test autoblocked user.""" with patch.object(pywikibot, 'info') as p: user = User(self.site, '#1242976') p.assert_called_once_with( 'This is an autoblock ID, you can only use to unblock it.') self.assertEqual('#1242976', user.username) self.assertEqual(user.title(with_ns=False), user.username[1:]) self.assertFalse(user.isRegistered()) self.assertFalse(user.isAnonymous()) self.assertIsNone(user.registration()) self.assertFalse(user.isEmailable()) self.assertIn('invalid', user.getprops()) self.assertTrue(user._isAutoblock) with self.assertRaisesRegex( AutoblockUserError, 'This is an autoblock ID'): user.getUserPage() with self.assertRaisesRegex( AutoblockUserError, 'This is an autoblock ID'): user.getUserTalkPage()
[docs] def test_autoblocked_user_with_namespace(self): """Test autoblocked user.""" # Suppress output: This is an autoblock ID, you can only use to unblock with patch.object(pywikibot, 'info'): user = User(self.site, 'User:#1242976') self.assertEqual('#1242976', user.username) self.assertEqual(user.title(with_ns=False), user.username[1:]) self.assertFalse(user.isRegistered()) self.assertFalse(user.isAnonymous()) self.assertIsNone(user.registration()) self.assertFalse(user.isEmailable()) self.assertIn('invalid', user.getprops()) self.assertTrue(user._isAutoblock) with self.assertRaisesRegex( AutoblockUserError, 'This is an autoblock ID'): user.getUserPage() with self.assertRaisesRegex( AutoblockUserError, 'This is an autoblock ID'): user.getUserTalkPage()
[docs] def test_locked_user(self): """Test global lock.""" user = User(self.site, 'TonjaHeritage2') self.assertTrue(user.is_locked())
[docs] class TestUserMethods(DefaultSiteTestCase): """Test User methods with bot user.""" login = True
[docs] def test_contribution(self): """Test the User.usercontribs() method.""" total = 50 mysite = self.get_site() user = User(mysite, mysite.user()) uc = list(user.contributions(total=total)) if not uc: self.skipTest('User {} has no contributions on site {}.' .format(mysite.user(), mysite)) self.assertLessEqual(len(uc), total) self.assertEqual(uc[0], user.last_edit) first_edit = uc[-1] if len(uc) < total else list( user.contributions(total=1, reverse=True))[0] self.assertEqual(first_edit, user.first_edit) for contrib in uc: self.assertIsInstance(contrib, tuple) self.assertLength(contrib, 4) p, i, t, c = contrib self.assertIsInstance(p, Page) self.assertIsInstance(i, int) self.assertIsInstance(t, Timestamp) self.assertIsInstance(c, str)
[docs] def test_logevents(self): """Test the User.logevents() method.""" mysite = self.get_site() user = User(mysite, mysite.user()) le = list(user.logevents(total=10)) if not le: self.skipTest( f'User {mysite.user()} has no logevents on site {mysite}.') self.assertLessEqual(len(le), 10) last = le[0] self.assertEqual(last, user.last_event) for event in le: self.assertEqual(event.user(), user.username)
if __name__ == '__main__': with suppress(SystemExit): unittest.main()