zapretgui/tests/test_updater_language_accessibility.py
loop-uh 9fed749dd1
All checks were successful
Zapret source guards / validate (push) Successful in 10s
Windows-сборка / Dev Dev 21.1.7.121 опубликован
Автообновление: программа ставит новую версию сама, по разрешению сервера с очередью
О выходе версии программе сообщает сервер («длинный запрос»,
updater/release/watch.py): он же ведёт очередь на скачивание и разрешает
обновляться. Находку по такому разрешению программа скачивает и ставит без
окна с вопросом; из трея — без окон, и новая версия открывается в трее.
Сама, без разрешения сервера, программа ничего не ставит: пользователей
около миллиона, и одновременное скачивание положило бы серверы. Если сервер
с очередью недоступен, всё работает как раньше — проверка при запуске и раз
в полчаса, находка предлагается окном.

Три неудачные попытки автоустановки одной версии возвращают окно с
предложением. Отложенную и пропущенную версии программа сама не ставит.
Выключатель на странице «Серверы» — «Обновлять программу автоматически»;
шаг экскурсии переписан.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:35:14 +03:00

275 lines
9.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from __future__ import annotations
import unittest
from config.build_info import APP_VERSION, CHANNEL
from updater.ui.language import apply_servers_page_language
class _TextTarget:
def __init__(self, text: str = ""):
self.text = 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 _Card:
titleLabel = None
def __init__(self):
self.title = ""
self.content = ""
self._accessible_name = ""
self._accessible_description = ""
self.properties = {}
def set_title(self, text):
self.title = text
def setContent(self, text): # noqa: N802
self.content = 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 _Stateful:
def __init__(self):
self.language = ""
self.texts = ()
self._accessible_name = ""
self._accessible_description = ""
self.properties = {}
def set_ui_language(self, language):
self.language = language
def set_texts(self, *texts):
self.texts = texts
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 _Breadcrumb:
def __init__(self):
self.items = []
def blockSignals(self, _blocked): # noqa: N802
pass
def clear(self):
self.items.clear()
def addItem(self, key, text): # noqa: N802
self.items.append((key, text))
class _Table:
def setHorizontalHeaderLabels(self, labels): # noqa: N802
self.labels = labels
class UpdaterLanguageAccessibilityTests(unittest.TestCase):
def test_language_refresh_updates_version_screen_reader_state(self) -> None:
version_info_label = _TextTarget("old")
apply_servers_page_language(
tr_fn=lambda _key, default, **_kwargs: default,
ui_language="ru",
update_card=_Stateful(),
breadcrumb=_Breadcrumb(),
page_title_label=_TextTarget(),
servers_title_label=_TextTarget(),
legend_active_label=_TextTarget(),
servers_table=_Table(),
settings_card=_Card(),
toggle_label=None,
auto_check_card=_Stateful(),
version_info_label=version_info_label,
telegram_card=_Card(),
telegram_info_label=None,
telegram_button=_TextTarget(),
refresh_server_rows=lambda: None,
)
expected = f"Версия ZapretGUI: v{APP_VERSION} · {CHANNEL}"
self.assertEqual(version_info_label.accessibleName(), expected)
self.assertEqual(
version_info_label.property("screenReaderStateText"),
expected,
)
def test_language_refresh_updates_active_legend_screen_reader_state(self) -> None:
legend_active_label = _TextTarget("old")
apply_servers_page_language(
tr_fn=lambda _key, default, **_kwargs: default,
ui_language="ru",
update_card=_Stateful(),
breadcrumb=_Breadcrumb(),
page_title_label=_TextTarget(),
servers_title_label=_TextTarget(),
legend_active_label=legend_active_label,
servers_table=_Table(),
settings_card=_Card(),
toggle_label=None,
auto_check_card=_Stateful(),
version_info_label=_TextTarget(),
telegram_card=_Card(),
telegram_info_label=None,
telegram_button=_TextTarget(),
refresh_server_rows=lambda: None,
)
expected = "Легенда серверов обновлений: активный сервер"
self.assertEqual(legend_active_label.accessibleName(), expected)
self.assertEqual(
legend_active_label.property("screenReaderStateText"),
expected,
)
def test_language_refresh_updates_header_screen_reader_state(self) -> None:
page_title_label = _TextTarget("old")
servers_title_label = _TextTarget("old")
apply_servers_page_language(
tr_fn=lambda _key, default, **_kwargs: default,
ui_language="ru",
update_card=_Stateful(),
breadcrumb=_Breadcrumb(),
page_title_label=page_title_label,
servers_title_label=servers_title_label,
legend_active_label=_TextTarget(),
servers_table=_Table(),
settings_card=_Card(),
toggle_label=None,
auto_check_card=_Stateful(),
version_info_label=_TextTarget(),
telegram_card=_Card(),
telegram_info_label=None,
telegram_button=_TextTarget(),
refresh_server_rows=lambda: None,
)
self.assertEqual(page_title_label.accessibleName(), "Страница: Серверы")
self.assertEqual(page_title_label.property("screenReaderStateText"), "Страница: Серверы")
self.assertEqual(servers_title_label.accessibleName(), "Раздел: Серверы обновлений")
self.assertEqual(servers_title_label.property("screenReaderStateText"), "Раздел: Серверы обновлений")
def test_language_refresh_updates_auto_check_screen_reader_state(self) -> None:
auto_check_card = _Stateful()
apply_servers_page_language(
tr_fn=lambda _key, default, **_kwargs: default,
ui_language="ru",
update_card=_Stateful(),
breadcrumb=_Breadcrumb(),
page_title_label=_TextTarget(),
servers_title_label=_TextTarget(),
legend_active_label=_TextTarget(),
servers_table=_Table(),
settings_card=_Card(),
toggle_label=None,
auto_check_card=auto_check_card,
version_info_label=_TextTarget(),
telegram_card=_Card(),
telegram_info_label=None,
telegram_button=_TextTarget(),
refresh_server_rows=lambda: None,
)
expected = "Обновлять программу автоматически"
self.assertEqual(auto_check_card.accessibleName(), expected)
self.assertEqual(auto_check_card.property("screenReaderStateText"), expected)
self.assertIn("скачивает новую версию", auto_check_card.accessibleDescription())
def test_language_refresh_updates_telegram_screen_reader_action(self) -> None:
telegram_card = _Card()
telegram_button = _TextTarget()
apply_servers_page_language(
tr_fn=lambda key, default, **_kwargs: {
"page.servers.telegram.accessible_name": "Открыть канал обновлений",
"page.servers.telegram.accessible_description": "Открывает канал с версиями программы.",
}.get(key, default),
ui_language="ru",
update_card=_Stateful(),
breadcrumb=_Breadcrumb(),
page_title_label=_TextTarget(),
servers_title_label=_TextTarget(),
legend_active_label=_TextTarget(),
servers_table=_Table(),
settings_card=_Card(),
toggle_label=None,
auto_check_card=_Stateful(),
version_info_label=_TextTarget(),
telegram_card=telegram_card,
telegram_info_label=None,
telegram_button=telegram_button,
refresh_server_rows=lambda: None,
)
self.assertEqual(telegram_card.accessibleName(), "Открыть канал обновлений")
self.assertEqual(telegram_card.property("screenReaderStateText"), "Открыть канал обновлений")
self.assertEqual(telegram_card.accessibleDescription(), "Открывает канал с версиями программы.")
self.assertEqual(telegram_button.accessibleName(), "Открыть канал обновлений")
self.assertEqual(telegram_button.property("screenReaderStateText"), "Открыть канал обновлений")
self.assertEqual(telegram_button.accessibleDescription(), "Открывает канал с версиями программы.")
if __name__ == "__main__":
unittest.main()