Source code for tests.thanks_tests

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

import unittest
from contextlib import suppress

from pywikibot.page import Page, User
from tests.aspects import TestCase


NO_THANKABLE_REVS = 'There is no recent change which can be test thanked.'


[docs] class TestThankRevision(TestCase): """Test thanks for revisions.""" family = 'wikipedia' code = 'test' login = True write = True
[docs] def test_thank_revision(self): """Test thanks for normal revisions. .. note:: This test relies on activity in recentchanges, and there must make edits made before reruns of this test. .. seealso:: :phab:`T137836`. """ site = self.get_site() data = site.recentchanges(total=20) for rev in data: revid = rev['revid'] username = rev['user'] user = User(site, username) if user.is_thankable: break else: self.skipTest(NO_THANKABLE_REVS) before_time = site.getcurrenttimestamp() site.thank_revision(revid, source='pywikibot test') log_entries = site.logevents(logtype='thanks', total=5, page=user, start=before_time, reverse=True) self.assertTrue(bool(next(log_entries, None)))
[docs] def test_self_thank(self): """Test that thanking oneself causes an error. This test is not in TestThankRevisionErrors because it may require making a successful edit in order to test the API call thanking the user running the test. """ site = self.get_site() my_name = self.get_userpage().username data = site.usercontribs(user=my_name, total=1) for rev in data: revid = rev['revid'] break else: test_page = Page(site, 'Pywikibot Thanks test') test_page.text += '* ~~~~\n' test_page.save('Pywikibot Thanks test') revid = test_page.latest_revision_id self.assertAPIError('invalidrecipient', None, site.thank_revision, revid, source='pywikibot test')
[docs] class TestThankRevisionErrors(TestCase): """Test errors when thanking revisions.""" family = 'wikipedia' code = 'test' write = -1
[docs] def test_bad_recipient(self): """Test that thanking a bad recipient causes an error.""" site = self.get_site() data = site.recentchanges(total=20) for rev in data: revid = rev['revid'] username = rev['user'] user = User(site, username) if not user.is_thankable: break else: self.skipTest(NO_THANKABLE_REVS) self.assertAPIError('invalidrecipient', None, site.thank_revision, revid, source='pywikibot test')
[docs] def test_invalid_revision(self): """Test that passing an invalid revision ID causes an error.""" site = self.get_site() invalid_revids = (0.99, (0, -1), (0, -1, 0.99), [0, -1, 0.99], 'zero', 'minus one, and point nine nine') code = 'invalidrevision' if site.mw_version < '1.35' else 'badinteger' for invalid_revid in invalid_revids: with self.subTest(revids=invalid_revid): self.assertAPIError(code, None, site.thank_revision, invalid_revid, source='pywikibot test') for invalid_revid in [0, -1, [0], [-1]]: with self.subTest(revids=invalid_revid): self.assertAPIError('invalidrevision', None, site.thank_revision, invalid_revid, source='pywikibot test')
if __name__ == '__main__': with suppress(SystemExit): unittest.main()