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()