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"