Files
zyt/app/tests/test_reception_completion_button_ui.py
T
2026-09-07 10:07:47 +08:00

123 lines
4.5 KiB
Python

from __future__ import annotations
import os
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
import pytest
from PySide6.QtCore import QPoint, Qt
from PySide6.QtTest import QTest
from PySide6.QtWidgets import QApplication, QHBoxLayout, QPushButton, QWidget
from doctor_workstation.ui.pages.reception import RECEPTION_QSS, _ReceptionCompleteButton
from doctor_workstation.ui.theme import apply_theme
@pytest.fixture
def controls():
app = QApplication.instance() or QApplication([])
old_stylesheet, old_font, old_palette = app.styleSheet(), app.font(), app.palette()
old_style = app.style().objectName()
apply_theme(app)
host = QWidget()
host.setObjectName("ReceptionPage")
host.setStyleSheet(RECEPTION_QSS)
layout = QHBoxLayout(host)
layout.setContentsMargins(20, 20, 20, 20)
layout.setSpacing(12)
button = _ReceptionCompleteButton(host)
neighbor = QPushButton("通知医助", host)
neighbor.setObjectName("ReceptionNotifyButton")
layout.addWidget(button)
layout.addWidget(neighbor)
host.show()
host.activateWindow()
button.clearFocus()
neighbor.clearFocus()
QTest.mouseMove(host, QPoint(1, 1))
app.processEvents()
yield app, host, button, neighbor
host.close()
host.deleteLater()
app.processEvents()
app.setStyle(old_style)
app.setFont(old_font)
app.setPalette(old_palette)
app.setStyleSheet(old_stylesheet)
def surface_color(button: QPushButton, *, border: bool = False) -> str:
image = button.grab().toImage()
scale = image.devicePixelRatio()
return image.pixelColor(
round((0 if border else 7) * scale), round(button.height() / 2 * scale)
).name()
def test_completion_hover_press_and_leave_have_feedback_without_layout_shift(controls):
app, host, button, neighbor = controls
geometry, neighbor_geometry = button.geometry(), neighbor.geometry()
clicked: list[bool] = []
button.clicked.connect(lambda: clicked.append(True))
assert surface_color(button) == "#ffffff"
assert button.cursor().shape() == Qt.CursorShape.PointingHandCursor
QTest.mouseMove(button, button.rect().center())
app.processEvents()
assert button.underMouse()
assert surface_color(button) == "#fff0f2"
assert button.geometry() == geometry
assert neighbor.geometry() == neighbor_geometry
QTest.mousePress(button, Qt.MouseButton.LeftButton, pos=button.rect().center())
app.processEvents()
assert surface_color(button) == "#ffe4e8"
assert button.geometry() == geometry
assert neighbor.geometry() == neighbor_geometry
# Dragging outside and releasing must not activate the completion action.
QTest.mouseMove(button, QPoint(-5, -5))
QTest.mouseRelease(button, Qt.MouseButton.LeftButton, pos=QPoint(-5, -5))
QTest.mouseMove(host, QPoint(1, 1))
button.clearFocus()
app.processEvents()
assert clicked == []
assert surface_color(button) == "#ffffff"
assert button.geometry() == geometry
assert neighbor.geometry() == neighbor_geometry
def test_completion_disabled_hover_does_not_look_or_act_enabled(controls):
app, _host, button, _neighbor = controls
clicked: list[bool] = []
button.clicked.connect(lambda: clicked.append(True))
button.setEnabled(False)
QTest.mouseMove(button, button.rect().center())
app.processEvents()
assert surface_color(button) == "#f7fafe"
assert button.cursor().shape() == Qt.CursorShape.ArrowCursor
QTest.mouseClick(button, Qt.MouseButton.LeftButton)
assert clicked == []
button.setEnabled(True)
app.processEvents()
assert button.cursor().shape() == Qt.CursorShape.PointingHandCursor
assert surface_color(button) != "#f7f7f7"
def test_completion_keyboard_focus_is_visible_without_resizing(controls):
app, _host, button, neighbor = controls
geometry, neighbor_geometry = button.geometry(), neighbor.geometry()
neighbor.setFocus(Qt.FocusReason.TabFocusReason)
app.processEvents()
border_before = surface_color(button, border=True)
button.setFocus(Qt.FocusReason.TabFocusReason)
app.processEvents()
assert button.hasFocus()
assert surface_color(button, border=True) == "#be4b58"
assert surface_color(button, border=True) != border_before
assert button.geometry() == geometry
assert neighbor.geometry() == neighbor_geometry
QTest.mouseMove(button, button.rect().center())
app.processEvents()
assert surface_color(button) == "#fff0f2"
assert surface_color(button, border=True) == "#be4b58"