zapret-kvn/tests/test_app_switch_slider.py
loop-uh fa6b10257c
Some checks failed
Windows project source guards / test (push) Failing after 1m24s
Панель: сфера подключения, плитки трафика, русские переключатели
- ConnectionOrb: векторная эмблема состояния с кнопкой питания; при
  подключении по кольцу бежит «комета», подключено — дыхание свечения
  и спутники. Таймер кадров только в анимированных состояниях, пока
  виджет виден и окно не свёрнуто; фаза от реального времени.
- Заголовок состояния в цвет (зелёный «Подключено», красная «Ошибка»),
  время в сети; трафик — плитки с крупными цифрами, сглаженный график
  без легенды поверх линий.
- QTranslator: «On/Off» qfluentwidgets → «Вкл/Выкл» во всём приложении.
- История: сводные цифры выровнены; Zapret: подсказка пустого списка.
2026-09-26 13:18:28 +03:00

116 lines
3.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.

"""Кружок SwitchButton всегда совпадает с состоянием (xray_fluent/ui/fluent_fixes.py).
Keep the ``test_app_*`` prefix: widget test modules must sort before
``tests/test_engine_process_stop.py`` which creates a bare QCoreApplication
at import time (see tests/test_app_nodes_page_view.py).
"""
from __future__ import annotations
import os
import time
import unittest
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
from PyQt6.QtCore import QEventLoop, QTimer
from PyQt6.QtWidgets import QApplication
_existing = QApplication.instance()
if _existing is not None and not isinstance(_existing, QApplication):
raise RuntimeError(
"A bare QCoreApplication was created before test_app_switch_slider "
"was imported; widget tests need a QApplication."
)
app = _existing or QApplication([])
import xray_fluent.ui # noqa: F401 (ставит fluent_fixes)
from qfluentwidgets import SwitchButton, SwitchSettingCard
from qfluentwidgets import FluentIcon as FIF
def _spin(ms: int) -> None:
loop = QEventLoop()
QTimer.singleShot(ms, loop.quit)
loop.exec()
class SwitchSliderTests(unittest.TestCase):
def setUp(self) -> None:
self.switch = SwitchButton()
self.switch.show()
_spin(20)
def tearDown(self) -> None:
self.switch.hide()
self.switch.deleteLater()
def _assert_settled(self) -> None:
_spin(250)
expected = 25.0 if self.switch.isChecked() else 5.0
self.assertAlmostEqual(self.switch.indicator.sliderX, expected, delta=0.5)
def test_rapid_on_off_on_ends_on_the_right(self) -> None:
# До фикса: checked=True, а кружок оставался на x=5 («выкл»).
self.switch.setChecked(True)
self.switch.setChecked(False)
self.switch.setChecked(True)
self.assertTrue(self.switch.isChecked())
self._assert_settled()
def test_resync_while_gui_thread_blocked(self) -> None:
self.switch.setChecked(True)
time.sleep(0.2)
self.switch.setChecked(False)
self.switch.setChecked(True)
self._assert_settled()
def test_reverse_mid_animation(self) -> None:
self.switch.setChecked(True)
_spin(60)
self.switch.setChecked(False)
_spin(20)
self.switch.setChecked(True)
self._assert_settled()
self.switch.setChecked(False)
_spin(30)
self.switch.setChecked(True)
self.switch.setChecked(False)
self._assert_settled()
def test_hidden_switch_snaps_immediately(self) -> None:
self.switch.hide()
self.switch.setChecked(True)
self.assertEqual(self.switch.indicator.sliderX, 25.0)
def test_setting_card_switch_is_patched(self) -> None:
card = SwitchSettingCard(FIF.GLOBE, "VPN (TUN)")
card.show()
try:
button = card.switchButton
button.setChecked(True)
button.setChecked(False)
button.setChecked(True)
_spin(250)
self.assertAlmostEqual(button.indicator.sliderX, 25.0, delta=0.5)
finally:
card.hide()
card.deleteLater()
class SwitchTranslationTests(unittest.TestCase):
def test_setting_card_switch_is_russian(self) -> None:
from xray_fluent.ui.fluent_fixes import install_translations
install_translations(app)
card = SwitchSettingCard(FIF.GLOBE, "Тест")
try:
self.assertEqual(card.switchButton.text, "Выкл")
card.setChecked(True)
self.assertEqual(card.switchButton.text, "Вкл")
finally:
card.deleteLater()
if __name__ == "__main__":
unittest.main()