zapretgui/tests/test_profile_shell_accessibility.py
loop-uh e46abeedc8
All checks were successful
Zapret source guards / validate (push) Successful in 3s
Перевести ZapretGUI с GitHub на Forgejo
2026-08-07 02:36:48 +03:00

109 lines
5.1 KiB
Python

from __future__ import annotations
import os
import unittest
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QApplication, QVBoxLayout, QWidget
from profile.ui.shell import build_profile_shell
class ProfileShellAccessibilityTests(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls._app = QApplication.instance() or QApplication([])
def test_toolbar_controls_have_screen_reader_text(self) -> None:
parent = QWidget()
parent.resize(900, 400)
layout = QVBoxLayout(parent)
widgets = build_profile_shell(
content_parent=parent,
content_layout=layout,
add_section_title=lambda *_args, **_kwargs: None,
tr_fn=lambda _key, default: default,
engine_label="Zapret 2",
toolbar_title_key="page.winws2_pages.toolbar.title",
request_button_key="page.winws2_pages.request.button",
request_hint_key="page.winws2_pages.request.hint",
loading_key="page.winws2_pages.loading",
on_open_profile_request_form=lambda: None,
on_add_user_profile=lambda: None,
on_expand_all=lambda: None,
on_collapse_all=lambda: None,
on_show_added_only=lambda: None,
on_show_all_profiles=lambda: None,
on_open_profile_order=lambda: None,
on_show_info_popup=lambda: None,
on_profile_search_text_changed=lambda _text: None,
)
expected = {
widgets.add_profile_btn: ("Добавить пользовательский profile", "Добавить новый пользовательский profile"),
widgets.request_btn: ("Открыть форму добавления profile в Forgejo", "Откройте готовую форму в Forgejo"),
widgets.view_menu_btn: ("Открыть меню вида профилей", "развернуть или свернуть группы"),
widgets.order_btn: ("Открыть порядок профилей в пресете", "изменения реального порядка профилей"),
widgets.info_btn: ("Показать справку по профилям", "Показать краткое объяснение"),
widgets.profile_search_input: ("Поиск профиля", "Поиск профиля по имени, портам и т.д."),
}
for widget, (name, description) in expected.items():
with self.subTest(name=name):
self.assertEqual(widget.accessibleName(), name)
self.assertIn(description, widget.accessibleDescription())
self.assertEqual(widget.property("screenReaderStateText"), name)
search_description = widgets.profile_search_input.accessibleDescription()
self.assertIn("После ввода перейдите в список клавишей Tab", search_description)
self.assertIn("или нажмите Стрелка вниз", search_description)
self.assertIn("выберите profile стрелками вверх и вниз", search_description)
self.assertIn("нажмите Enter или Пробел", search_description)
search_buttons = [
child
for child in widgets.profile_search_input.findChildren(object)
if str(getattr(child, "objectName", lambda: "")() or "") == "lineEditButton"
and hasattr(child, "setFocusPolicy")
]
self.assertTrue(search_buttons)
self.assertTrue(all(button.focusPolicy() == Qt.FocusPolicy.NoFocus for button in search_buttons))
def test_toolbar_uses_one_view_menu_instead_of_expand_and_collapse_buttons(self) -> None:
parent = QWidget()
parent.resize(900, 400)
layout = QVBoxLayout(parent)
widgets = build_profile_shell(
content_parent=parent,
content_layout=layout,
add_section_title=lambda *_args, **_kwargs: None,
tr_fn=lambda _key, default: default,
engine_label="Zapret 2",
toolbar_title_key="page.winws2_pages.toolbar.title",
request_button_key="page.winws2_pages.request.button",
request_hint_key="page.winws2_pages.request.hint",
loading_key="page.winws2_pages.loading",
on_open_profile_request_form=lambda: None,
on_add_user_profile=lambda: None,
on_expand_all=lambda: None,
on_collapse_all=lambda: None,
on_show_added_only=lambda: None,
on_show_all_profiles=lambda: None,
on_open_profile_order=lambda: None,
on_show_info_popup=lambda: None,
on_profile_search_text_changed=lambda _text: None,
)
button_texts = [button.text() for button in widgets.toolbar_actions_bar._buttons]
self.assertIn("Вид", button_texts)
self.assertIn("Порядок в пресете", button_texts)
self.assertNotIn("Развернуть", button_texts)
self.assertNotIn("Свернуть", button_texts)
if __name__ == "__main__":
unittest.main()