#!/usr/bin/env python3
"""Tests for the redirect.py script."""
#
# (C) Pywikibot team, 2017-2022
#
# Distributed under the terms of the MIT license.
#
from __future__ import annotations
import unittest
from contextlib import suppress
from unittest.mock import Mock, patch
import pywikibot
from pywikibot import Page, i18n
from scripts.redirect import RedirectRobot
from tests.aspects import DefaultSiteTestCase
[docs]
class RedirectTestRobot(RedirectRobot):
"""RedirectRobot test class."""
@property
def current_page(self):
"""Patch current_page to return any page."""
return Page(self.site, 'Main', ns=4)
@property
def site(self):
"""Patch site to return a site object."""
return pywikibot.Site()
[docs]
@patch.object(Page, 'exists', new=Mock(return_value=True))
class TestGetSDTemplateNoSysop(DefaultSiteTestCase):
"""Test the get_sd_template method of the RedirectRobot class."""
[docs]
def test_with_delete_and_existing_sdtemplate(self):
"""Test with delete and existing sdtemplate."""
options = {'delete': True, 'sdtemplate': '{{t}}'}
bot = RedirectTestRobot('broken', **options)
self.assertEqual(bot.sdtemplate, '{{t}}')
[docs]
@patch.object(i18n, 'twhas_key', new=Mock(return_value=True))
@patch.object(i18n, 'twtranslate', new=Mock(return_value='{{sd_title}}'))
def test_with_delete_and_i18n_sd(self):
"""Test with delete and i18n template."""
bot = RedirectTestRobot('broken', delete=True)
self.assertEqual(bot.sdtemplate, '{{sd_title}}')
[docs]
@patch.object(i18n, 'twhas_key', new=Mock(return_value=False))
def test_with_delete_no_sd_no_i18n(self):
"""Test with delete and no i18n template."""
bot = RedirectTestRobot('broken', delete=True)
with patch.object(pywikibot, 'warning') as w:
self.assertIsNone(bot.sdtemplate)
w.assert_called_with('No speedy deletion template available.')
[docs]
def test_with_delete_and_non_existing_sdtemplate(self):
"""Test with delete and non-exisitng sdtemplate."""
options = {'delete': True, 'sdtemplate': 'txt {{n|a}} txt'}
bot = RedirectTestRobot('broken', **options)
with patch.object(Page, 'exists', new=Mock(return_value=False)), \
patch.object(pywikibot, 'warning') as w:
self.assertIsNone(bot.sdtemplate, None)
w.assert_called_with('No speedy deletion template "n" available.')
if __name__ == '__main__':
with suppress(SystemExit):
unittest.main()