Files
zyt/app/tests/test_window_open_geometry.py
T

227 lines
8.1 KiB
Python
Executable File

from __future__ import annotations
import os
import pytest
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
from PySide6.QtCore import QPoint, QRect, Qt, QTimer
from PySide6.QtWidgets import QApplication, QDialog, QMainWindow, QWidget
from doctor_workstation.core import PermissionSet
from doctor_workstation.services import DemoDoctorRepository
from doctor_workstation.ui.appointment_drawer import AppointmentDrawer
from doctor_workstation.ui.dialogs.ai_consult_picker import AiConsultTargetDialog
from doctor_workstation.ui.dialogs.diagnosis import DiagnosisDialog, OrderDetailDrawer
from doctor_workstation.ui.dialogs.prescription import PrescriptionEditorDialog
from doctor_workstation.ui.shell import ShellWindow
from doctor_workstation.ui.theme import _install_business_dialog_styling
def test_new_dialog_and_im_window_use_85_percent_of_main_window() -> None:
app = QApplication.instance() or QApplication([])
_install_business_dialog_styling(app)
main = QMainWindow()
main.setProperty("doctorMainWindow", True)
main.setGeometry(40, 60, 1200, 800)
main.show()
app.processEvents()
dialog = QDialog(main)
dialog.setMinimumSize(1100, 700)
im_window = QMainWindow()
im_window.resize(1120, 760)
try:
for window in (dialog, im_window):
window.show()
app.processEvents()
assert window.size().width() == round(main.frameGeometry().width() * 0.85)
assert window.size().height() == round(main.frameGeometry().height() * 0.85)
assert abs(window.frameGeometry().center().x() - main.frameGeometry().center().x()) <= 1
assert abs(window.frameGeometry().center().y() - main.frameGeometry().center().y()) <= 1
window.hide()
main.resize(1400, 900)
app.processEvents()
for window in (dialog, im_window):
window.show()
app.processEvents()
assert window.width() == round(main.frameGeometry().width() * 0.85)
assert window.height() == round(main.frameGeometry().height() * 0.85)
finally:
im_window.close()
dialog.close()
main.close()
def test_frameless_drawer_keeps_its_owner_layout() -> None:
app = QApplication.instance() or QApplication([])
_install_business_dialog_styling(app)
main = QMainWindow()
main.setProperty("doctorMainWindow", True)
main.resize(1200, 800)
main.show()
app.processEvents()
drawer = QDialog(main)
drawer.setWindowFlag(Qt.WindowType.FramelessWindowHint, True)
drawer.resize(500, 400)
try:
drawer.show()
app.processEvents()
assert drawer.size().width() == 500
assert drawer.size().height() == 400
finally:
drawer.close()
main.close()
def test_modal_exec_uses_main_window_geometry() -> None:
app = QApplication.instance() or QApplication([])
_install_business_dialog_styling(app)
main = QMainWindow()
main.setProperty("doctorMainWindow", True)
main.setGeometry(30, 50, 1200, 800)
main.show()
app.processEvents()
dialog = QDialog(main)
try:
QTimer.singleShot(0, dialog.accept)
dialog.exec()
assert dialog.width() == round(main.frameGeometry().width() * 0.85)
assert dialog.height() == round(main.frameGeometry().height() * 0.85)
finally:
dialog.close()
main.close()
def test_business_windows_and_standalone_readonly_keep_main_window_85_percent() -> None:
app = QApplication.instance() or QApplication([])
_install_business_dialog_styling(app)
main = QMainWindow()
main.setProperty("doctorMainWindow", True)
main.setGeometry(30, 50, 1400, 900)
main.show()
app.processEvents()
repository = DemoDoctorRepository()
dialogs = [
AppointmentDrawer({"id": 501, "diagnosis_id": 501}, repository, main, autoload=False),
DiagnosisDialog(repository, main),
PrescriptionEditorDialog(repository, parent=main),
]
try:
for dialog in dialogs:
dialog.show()
app.processEvents()
app.processEvents()
assert dialog.width() == round(main.frameGeometry().width() * 0.85)
assert dialog.height() == round(main.frameGeometry().height() * 0.85)
dialog.hide()
finally:
for dialog in dialogs:
dialog.close()
main.close()
def _client_geometry(widget):
return QRect(widget.mapToGlobal(QPoint(0, 0)), widget.size())
def _settle(app):
for _ in range(4):
app.processEvents()
@pytest.mark.parametrize("view_only", [False, True])
def test_diagnosis_drawer_scrim_covers_the_entire_workstation_client_area(view_only) -> None:
app = QApplication.instance() or QApplication([])
_install_business_dialog_styling(app)
main = QMainWindow()
main.setProperty("doctorMainWindow", True)
main.setGeometry(30, 50, 1400, 900)
page = QWidget(main)
main.setCentralWidget(page)
main.show()
_settle(app)
dialog = DiagnosisDialog(object(), page, permissions=PermissionSet(["tcm.diagnosis/edit"]))
try:
dialog.open_for(501, editable=not view_only, view_only=view_only,
authoritative_detail={"diagnosis": {"id": 501, "patient_id": 1501}})
_settle(app)
def assert_full_coverage():
assert _client_geometry(dialog) == _client_geometry(main)
assert dialog.drawer_overlay.rect() == dialog.rect()
assert dialog.drawer_panel.width() == round(main.width() * 0.60)
assert dialog.drawer_panel.mapTo(dialog, QPoint(0, 0)).x() + dialog.drawer_panel.width() == dialog.width()
assert dialog.drawer_panel.height() == dialog.height()
image = dialog.grab().toImage()
shade = image.pixelColor(2, 2)
assert shade.alpha() > 0
assert image.pixelColor(2, image.height() - 3) == shade
assert_full_coverage()
main.setGeometry(70, 80, 1200, 780)
_settle(app)
assert_full_coverage()
main.showMaximized()
_settle(app)
assert_full_coverage()
main.showNormal()
_settle(app)
assert_full_coverage()
finally:
dialog.close()
main.close()
@pytest.mark.parametrize("standalone_readonly", [False, True])
def test_order_scrim_covers_its_diagnosis_owner_while_main_window_is_visible(standalone_readonly) -> None:
app = QApplication.instance() or QApplication([])
_install_business_dialog_styling(app)
main = QMainWindow()
main.setProperty("doctorMainWindow", True)
main.setGeometry(30, 50, 1400, 900)
main.show()
_settle(app)
owner = DiagnosisDialog(object(), main, permissions=PermissionSet(["tcm.diagnosis/edit"]))
owner.open_for(501, editable=not standalone_readonly,
authoritative_detail={"diagnosis": {"id": 501, "patient_id": 1501}})
drawer = OrderDetailDrawer(owner)
try:
drawer.show()
_settle(app)
assert _client_geometry(drawer) == _client_geometry(owner)
assert drawer.drawer_panel.width() == round(owner.width() * 0.8)
assert drawer.scrim.height() == owner.height()
main.setGeometry(70, 80, 1280, 820)
_settle(app)
assert _client_geometry(drawer) == _client_geometry(owner)
finally:
drawer.close()
owner.close()
main.close()
def test_maximized_workstation_opens_patient_picker_at_85_percent() -> None:
app = QApplication.instance() or QApplication([])
_install_business_dialog_styling(app)
repository = DemoDoctorRepository()
permissions = PermissionSet(["*"])
main = ShellWindow(
repository,
{"user": {"name": "测试医生"}, "demo_mode": True},
permissions,
)
main.showMaximized()
app.processEvents()
picker = AiConsultTargetDialog(repository, permissions, main)
try:
picker.show()
app.processEvents()
assert main.isMaximized()
assert picker.width() == round(main.frameGeometry().width() * 0.85)
assert picker.height() == round(main.frameGeometry().height() * 0.85)
finally:
picker.close()
main.close()