zapretgui/tests/test_updater_settings_build.py
2026-06-12 16:44:53 +03:00

309 lines
10 KiB
Python

from __future__ import annotations
import unittest
from PyQt6.QtCore import QEvent, Qt
from PyQt6.QtGui import QKeyEvent
from updater.ui import settings_build
from updater.ui.settings_build import build_servers_settings_section
class _FakeSignal:
def connect(self, callback):
self.callback = callback
def emit(self):
callback = getattr(self, "callback", None)
if callback is not None:
callback()
class _FakeToggleRow:
def __init__(self, *args):
self.args = args
self.toggled = _FakeSignal()
self._accessible_name = ""
self._accessible_description = ""
self.properties = {}
def setChecked(self, value, *, block_signals=False): # noqa: N802
self.checked = bool(value)
self.block_signals = bool(block_signals)
def accessibleName(self): # noqa: N802
return self._accessible_name
def setAccessibleName(self, value): # noqa: N802
self._accessible_name = value
def accessibleDescription(self): # noqa: N802
return self._accessible_description
def setAccessibleDescription(self, value): # noqa: N802
self._accessible_description = value
def property(self, name):
return self.properties.get(name)
def setProperty(self, name, value): # noqa: N802
self.properties[name] = value
class _FakeSettingsGroup:
def __init__(self, title, parent):
self.title = title
self.parent = parent
self.rows = []
def addSettingCard(self, row): # noqa: N802
self.rows.append(row)
class _FakeCard:
def add_layout(self, layout):
self.layout = layout
class _FakeButton:
def __init__(self):
self.text = ""
self._accessible_name = ""
self._accessible_description = ""
self.properties = {}
def setText(self, text): # noqa: N802
self.text = text
def setAccessibleName(self, value): # noqa: N802
self._accessible_name = value
def accessibleName(self): # noqa: N802
return self._accessible_name
def setAccessibleDescription(self, value): # noqa: N802
self._accessible_description = value
def accessibleDescription(self): # noqa: N802
return self._accessible_description
def setProperty(self, name, value): # noqa: N802
self.properties[name] = value
def property(self, name):
return self.properties.get(name)
class _FakePushSettingCard:
def __init__(self, action_text, icon, title, content):
self.action_text = action_text
self.icon = icon
self.title = title
self.content = content
self.button = _FakeButton()
self.clicked = _FakeSignal()
self._accessible_name = ""
self._accessible_description = ""
self.properties = {}
self._focus_policy = Qt.FocusPolicy.NoFocus
def setAccessibleName(self, value): # noqa: N802
self._accessible_name = value
def accessibleName(self): # noqa: N802
return self._accessible_name
def setAccessibleDescription(self, value): # noqa: N802
self._accessible_description = value
def accessibleDescription(self): # noqa: N802
return self._accessible_description
def setProperty(self, name, value): # noqa: N802
self.properties[name] = value
def property(self, name):
return self.properties.get(name)
def focusPolicy(self): # noqa: N802
return self._focus_policy
def setFocusPolicy(self, value): # noqa: N802
self._focus_policy = value
def keyPressEvent(self, _event): # noqa: N802
pass
class _FakeLabel:
def __init__(self, text):
self.text = text
self._accessible_name = ""
self.properties = {}
def setAccessibleName(self, value): # noqa: N802
self._accessible_name = value
def accessibleName(self): # noqa: N802
return self._accessible_name
def setProperty(self, name, value): # noqa: N802
self.properties[name] = value
def property(self, name):
return self.properties.get(name)
class _FakeLayout:
def setContentsMargins(self, *args): # noqa: N802
self.margins = args
def setSpacing(self, value): # noqa: N802
self.spacing = value
def addWidget(self, widget): # noqa: N802
self.widget = widget
def addStretch(self): # noqa: N802
self.stretch = True
class UpdaterSettingsBuildTests(unittest.TestCase):
def test_version_label_is_not_added_as_full_settings_card(self) -> None:
widgets = build_servers_settings_section(
content_parent=object(),
tr_fn=lambda _key, default: default,
accent_hex="#22dddd",
auto_check_enabled=True,
app_version="21.0.0.142",
channel="dev",
setting_card_group_cls=_FakeSettingsGroup,
settings_card_cls=_FakeCard,
win11_toggle_row_cls=_FakeToggleRow,
caption_label_cls=_FakeLabel,
qhbox_layout_cls=_FakeLayout,
on_auto_check_toggled=lambda _value: None,
)
self.assertEqual(len(widgets.card.rows), 1)
self.assertIs(widgets.card.rows[0], widgets.auto_check_card)
self.assertEqual(widgets.version_info_label.text, "v21.0.0.142 · dev")
def test_version_label_exposes_screen_reader_state(self) -> None:
widgets = build_servers_settings_section(
content_parent=object(),
tr_fn=lambda _key, default: default,
accent_hex="#22dddd",
auto_check_enabled=False,
app_version="21.0.0.142",
channel="dev",
setting_card_group_cls=_FakeSettingsGroup,
settings_card_cls=_FakeCard,
win11_toggle_row_cls=_FakeToggleRow,
caption_label_cls=_FakeLabel,
qhbox_layout_cls=_FakeLayout,
on_auto_check_toggled=lambda _value: None,
)
self.assertEqual(widgets.version_info_label.accessibleName(), "Версия ZapretGUI: v21.0.0.142 · dev")
self.assertEqual(
widgets.version_info_label.property("screenReaderStateText"),
"Версия ZapretGUI: v21.0.0.142 · dev",
)
def test_auto_check_toggle_exposes_screen_reader_state(self) -> None:
enabled_widgets = build_servers_settings_section(
content_parent=object(),
tr_fn=lambda _key, default: default,
accent_hex="#22dddd",
auto_check_enabled=True,
app_version="21.0.0.142",
channel="dev",
setting_card_group_cls=_FakeSettingsGroup,
settings_card_cls=_FakeCard,
win11_toggle_row_cls=_FakeToggleRow,
caption_label_cls=_FakeLabel,
qhbox_layout_cls=_FakeLayout,
on_auto_check_toggled=lambda _value: None,
)
disabled_widgets = build_servers_settings_section(
content_parent=object(),
tr_fn=lambda _key, default: default,
accent_hex="#22dddd",
auto_check_enabled=False,
app_version="21.0.0.142",
channel="dev",
setting_card_group_cls=_FakeSettingsGroup,
settings_card_cls=_FakeCard,
win11_toggle_row_cls=_FakeToggleRow,
caption_label_cls=_FakeLabel,
qhbox_layout_cls=_FakeLayout,
on_auto_check_toggled=lambda _value: None,
)
self.assertEqual(
enabled_widgets.auto_check_card.accessibleName(),
"Проверять обновления при запуске, включено",
)
self.assertEqual(
enabled_widgets.auto_check_card.property("screenReaderStateText"),
"Проверять обновления при запуске, включено",
)
self.assertIn("Автоматически проверять", enabled_widgets.auto_check_card.accessibleDescription())
self.assertEqual(
disabled_widgets.auto_check_card.accessibleName(),
"Проверять обновления при запуске, выключено",
)
self.assertEqual(
disabled_widgets.auto_check_card.property("screenReaderStateText"),
"Проверять обновления при запуске, выключено",
)
def test_telegram_card_and_button_expose_screen_reader_action(self) -> None:
old_icon_factory = settings_build.get_themed_qta_icon
settings_build.get_themed_qta_icon = lambda *_args, **_kwargs: object()
self.addCleanup(setattr, settings_build, "get_themed_qta_icon", old_icon_factory)
widgets = settings_build.build_servers_telegram_section(
tr_fn=lambda _key, default: default,
accent_hex="#22dddd",
push_setting_card_cls=_FakePushSettingCard,
on_open_channel=lambda: None,
)
expected_name = "Открыть Telegram канал обновлений"
self.assertEqual(widgets.card.accessibleName(), expected_name)
self.assertEqual(widgets.card.property("screenReaderStateText"), expected_name)
self.assertIn("версии программы", widgets.card.accessibleDescription())
self.assertEqual(widgets.button.accessibleName(), expected_name)
self.assertEqual(widgets.button.property("screenReaderStateText"), expected_name)
self.assertIn("версии программы", widgets.button.accessibleDescription())
def test_telegram_card_opens_from_keyboard(self) -> None:
old_icon_factory = settings_build.get_themed_qta_icon
settings_build.get_themed_qta_icon = lambda *_args, **_kwargs: object()
self.addCleanup(setattr, settings_build, "get_themed_qta_icon", old_icon_factory)
opened: list[bool] = []
widgets = settings_build.build_servers_telegram_section(
tr_fn=lambda _key, default: default,
accent_hex="#22dddd",
push_setting_card_cls=_FakePushSettingCard,
on_open_channel=lambda: opened.append(True),
)
self.assertEqual(widgets.card.focusPolicy(), Qt.FocusPolicy.StrongFocus)
widgets.card.keyPressEvent(
QKeyEvent(
QEvent.Type.KeyPress,
Qt.Key.Key_Return,
Qt.KeyboardModifier.NoModifier,
)
)
self.assertEqual(opened, [True])
if __name__ == "__main__":
unittest.main()