更新bug
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""Qt 悬浮监听条的布局与交互回归测试。"""
|
||||
|
||||
import os
|
||||
from types import SimpleNamespace
|
||||
from unittest import TestCase, main, skipUnless
|
||||
|
||||
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
||||
|
||||
try:
|
||||
from PySide6.QtCore import QPoint, Qt
|
||||
from PySide6.QtGui import QFontMetrics
|
||||
from PySide6.QtWidgets import (
|
||||
QApplication,
|
||||
QMainWindow,
|
||||
QStackedWidget,
|
||||
QVBoxLayout,
|
||||
QWidget,
|
||||
)
|
||||
except ImportError:
|
||||
QApplication = None
|
||||
else:
|
||||
from wechat_gui_qt import APP_QSS, CapsuleWindow, MainWindow
|
||||
|
||||
|
||||
@skipUnless(QApplication is not None, "当前测试环境未安装 PySide6")
|
||||
class CapsuleWindowTest(TestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.app = QApplication.instance() or QApplication([])
|
||||
cls.app.setStyleSheet(APP_QSS)
|
||||
|
||||
def setUp(self):
|
||||
self.capsule = CapsuleWindow()
|
||||
self.capsule.show()
|
||||
self.app.processEvents()
|
||||
|
||||
def tearDown(self):
|
||||
self.capsule.close()
|
||||
self.app.processEvents()
|
||||
|
||||
def test_compact_layout_has_no_horizontal_overlap(self):
|
||||
self.assertEqual((self.capsule.width(), self.capsule.height()), (436, 112))
|
||||
self.assertEqual((self.capsule.panel.width(), self.capsule.panel.height()), (420, 94))
|
||||
|
||||
widgets = (
|
||||
self.capsule.status_group,
|
||||
self.capsule.timer,
|
||||
self.capsule.divider,
|
||||
self.capsule.stop_button,
|
||||
self.capsule.expand_button,
|
||||
)
|
||||
bounds = []
|
||||
for widget in widgets:
|
||||
origin = widget.mapTo(self.capsule.panel, QPoint(0, 0))
|
||||
bounds.append((origin.x(), origin.x() + widget.width() - 1))
|
||||
for previous, current in zip(bounds, bounds[1:]):
|
||||
self.assertLess(previous[1], current[0])
|
||||
|
||||
def test_timer_and_longest_copy_fit_their_widgets(self):
|
||||
timer_width = QFontMetrics(self.capsule.timer.font()).horizontalAdvance("00:00:00")
|
||||
self.assertLessEqual(timer_width, self.capsule.timer.contentsRect().width())
|
||||
|
||||
states = {
|
||||
"running": ("监听中", "安全运行中"),
|
||||
"waiting": ("等待企业微信", "等待企业微信"),
|
||||
"connecting": ("连接中", "正在连接窗口"),
|
||||
"stopping": ("正在停止", "正在结束任务"),
|
||||
"error": ("连接失败", "请查看运行日志"),
|
||||
"verification": ("需要扫码验证", "请先用手机扫码验证"),
|
||||
"stopped": ("已停止", "监听已停止"),
|
||||
}
|
||||
for state, (status, hint) in states.items():
|
||||
with self.subTest(state=state):
|
||||
self.capsule.set_status(state, status)
|
||||
self.app.processEvents()
|
||||
self.assertEqual(self.capsule.hint.text(), hint)
|
||||
status_width = QFontMetrics(
|
||||
self.capsule.status.font()
|
||||
).horizontalAdvance(self.capsule.status.text())
|
||||
hint_width = QFontMetrics(
|
||||
self.capsule.hint.font()
|
||||
).horizontalAdvance(self.capsule.hint.text())
|
||||
self.assertLessEqual(status_width, self.capsule.status.width())
|
||||
self.assertLessEqual(hint_width, self.capsule.hint.width())
|
||||
|
||||
self.capsule.timer.setText("99:59:59")
|
||||
timer_width = QFontMetrics(self.capsule.timer.font()).horizontalAdvance(
|
||||
self.capsule.timer.text()
|
||||
)
|
||||
self.assertLessEqual(timer_width, self.capsule.timer.contentsRect().width())
|
||||
|
||||
def test_status_copy_and_actions_remain_connected(self):
|
||||
self.capsule.set_status("waiting", "等待企业微信")
|
||||
self.assertEqual(self.capsule.status.text(), "等待企业微信")
|
||||
self.assertEqual(self.capsule.hint.text(), "等待企业微信")
|
||||
|
||||
events = []
|
||||
self.capsule.expandRequested.connect(lambda: events.append("expand"))
|
||||
self.capsule.stopRequested.connect(lambda: events.append("stop"))
|
||||
self.capsule.expand_button.click()
|
||||
self.capsule.stop_button.click()
|
||||
self.assertEqual(events, ["expand", "stop"])
|
||||
self.assertEqual(self.capsule.stop_button.icon_kind, "pause")
|
||||
self.assertEqual(self.capsule.expand_button.icon_kind, "fullscreen")
|
||||
self.assertEqual(self.capsule.stop_button.toolTip(), "停止监听")
|
||||
self.assertEqual(self.capsule.expand_button.toolTip(), "展开控制台")
|
||||
self.assertLess(
|
||||
self.capsule.stop_button.geometry().left(),
|
||||
self.capsule.expand_button.geometry().left(),
|
||||
)
|
||||
|
||||
def test_window_flags_and_position_keep_capsule_non_intrusive(self):
|
||||
flags = self.capsule.windowFlags()
|
||||
self.assertTrue(flags & Qt.Tool)
|
||||
self.assertTrue(flags & Qt.FramelessWindowHint)
|
||||
self.assertTrue(flags & Qt.WindowStaysOnTopHint)
|
||||
self.assertTrue(flags & Qt.WindowDoesNotAcceptFocus)
|
||||
|
||||
self.capsule.show_near(self.capsule)
|
||||
self.app.processEvents()
|
||||
area = self.capsule.screen().availableGeometry()
|
||||
self.assertEqual(self.capsule.y(), area.y() + 28)
|
||||
self.assertEqual(
|
||||
self.capsule.x(),
|
||||
area.x() + (area.width() - self.capsule.width()) // 2,
|
||||
)
|
||||
|
||||
|
||||
@skipUnless(QApplication is not None, "当前测试环境未安装 PySide6")
|
||||
class MainWindowMinimizeTest(TestCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.app = QApplication.instance() or QApplication([])
|
||||
cls.app.setStyleSheet(APP_QSS)
|
||||
|
||||
def setUp(self):
|
||||
self.window = MainWindow.__new__(MainWindow)
|
||||
QMainWindow.__init__(self.window)
|
||||
self.window.resize(900, 700)
|
||||
self.window._running = False
|
||||
self.window._capsule_minimize_pending = False
|
||||
self.window._saved_geometry = None
|
||||
self.window._was_maximized = False
|
||||
self.window._portal_was_visible = False
|
||||
self.window.capsule = CapsuleWindow()
|
||||
|
||||
self.window.stack = QStackedWidget()
|
||||
page = QWidget()
|
||||
page_layout = QVBoxLayout(page)
|
||||
portal_view = QWidget()
|
||||
page_layout.addWidget(portal_view)
|
||||
self.window.stack.addWidget(page)
|
||||
self.window.setCentralWidget(self.window.stack)
|
||||
self.window.portal_page = SimpleNamespace(view=portal_view)
|
||||
self.window.show()
|
||||
self.app.processEvents()
|
||||
|
||||
def tearDown(self):
|
||||
self.window.capsule.close()
|
||||
self.window.hide()
|
||||
self.window.deleteLater()
|
||||
self.app.processEvents()
|
||||
|
||||
def test_minimize_while_running_switches_to_capsule_and_can_expand(self):
|
||||
self.window._running = True
|
||||
self.window.showMinimized()
|
||||
self.app.processEvents()
|
||||
self.app.processEvents()
|
||||
|
||||
self.assertTrue(self.window.capsule.isVisible())
|
||||
self.assertFalse(self.window.isVisible())
|
||||
self.assertIsNotNone(self.window._saved_geometry)
|
||||
|
||||
self.window.expand_console()
|
||||
self.app.processEvents()
|
||||
self.assertFalse(self.window.capsule.isVisible())
|
||||
self.assertTrue(self.window.isVisible())
|
||||
self.assertFalse(self.window.isMinimized())
|
||||
|
||||
def test_minimize_while_stopped_keeps_normal_taskbar_behavior(self):
|
||||
self.window._running = False
|
||||
self.window.showMinimized()
|
||||
self.app.processEvents()
|
||||
self.app.processEvents()
|
||||
|
||||
self.assertTrue(self.window.isVisible())
|
||||
self.assertTrue(self.window.isMinimized())
|
||||
self.assertFalse(self.window.capsule.isVisible())
|
||||
|
||||
def test_minimize_from_maximized_restores_maximized_console(self):
|
||||
self.window._running = True
|
||||
self.window.showMaximized()
|
||||
self.app.processEvents()
|
||||
self.assertTrue(self.window.isMaximized())
|
||||
|
||||
self.window.showMinimized()
|
||||
self.app.processEvents()
|
||||
self.app.processEvents()
|
||||
self.assertTrue(self.window.capsule.isVisible())
|
||||
self.assertTrue(self.window._was_maximized)
|
||||
|
||||
self.window.expand_console()
|
||||
self.app.processEvents()
|
||||
self.assertTrue(self.window.isVisible())
|
||||
self.assertTrue(self.window.isMaximized())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user