更新
This commit is contained in:
@@ -8,7 +8,7 @@ from typing import Any
|
||||
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
||||
|
||||
import pytest
|
||||
from PySide6.QtCore import Qt
|
||||
from PySide6.QtCore import QPoint, Qt
|
||||
from PySide6.QtTest import QTest
|
||||
from PySide6.QtWidgets import (
|
||||
QApplication,
|
||||
@@ -125,6 +125,56 @@ def test_ai_consult_dialog_matches_workspace_chrome(
|
||||
dialog.close()
|
||||
|
||||
|
||||
def test_header_and_chat_filter_move_to_right_pane_and_filter_message_roles(
|
||||
application: QApplication,
|
||||
) -> None:
|
||||
dialog = AiConsultDialog(
|
||||
DemoDoctorRepository(), PermissionSet(["tcm.diagnosis/aiAssistant"])
|
||||
)
|
||||
patient = dialog._append_bubble("patient", "患者提问")
|
||||
doctor = dialog._append_bubble("doctor", "医生回复")
|
||||
ai = dialog._append_bubble("ai", "智能分析")
|
||||
system = dialog._append_event(title="视频开始")
|
||||
dialog.show()
|
||||
application.processEvents()
|
||||
|
||||
right_pane = dialog.findChild(QWidget, "AiConsultRightPane")
|
||||
chat_pane = dialog.findChild(QWidget, "AiConsultChatPane")
|
||||
assert right_pane is not None and chat_pane is not None
|
||||
assert right_pane.mapTo(dialog, QPoint(0, 0)).x() >= chat_pane.mapTo(
|
||||
dialog, QPoint(chat_pane.width(), 0)
|
||||
).x()
|
||||
assert dialog.tabs.parentWidget() is right_pane
|
||||
assert dialog.chat_filter_button.parentWidget() is right_pane
|
||||
assert right_pane.findChild(QWidget, "AiConsultHero") is not None
|
||||
assert all(item.isVisible() for item in (patient, doctor, ai, system))
|
||||
|
||||
actions = {action.data(): action for action in dialog.chat_filter_menu.actions()}
|
||||
actions["doctor"].trigger()
|
||||
application.processEvents()
|
||||
assert doctor.isVisible()
|
||||
assert not patient.isVisible()
|
||||
assert not ai.isVisible()
|
||||
assert not system.isVisible()
|
||||
|
||||
new_doctor = dialog._append_bubble("doctor", "新的医生回复")
|
||||
new_patient = dialog._append_bubble("patient", "新的患者提问")
|
||||
application.processEvents()
|
||||
assert new_doctor.isVisible()
|
||||
assert not new_patient.isVisible()
|
||||
|
||||
actions["all"].trigger()
|
||||
application.processEvents()
|
||||
assert all(item.isVisible() for item in (patient, doctor, ai, system, new_doctor, new_patient))
|
||||
dialog.tabs.setCurrentIndex(1)
|
||||
application.processEvents()
|
||||
assert not dialog.chat_filter_button.isVisible()
|
||||
dialog.tabs.setCurrentIndex(0)
|
||||
application.processEvents()
|
||||
assert dialog.chat_filter_button.isVisible()
|
||||
dialog.close()
|
||||
|
||||
|
||||
@pytest.mark.parametrize("key", [Qt.Key.Key_Return, Qt.Key.Key_Enter])
|
||||
def test_input_enter_submits_once_without_closing_dialog(
|
||||
application: QApplication,
|
||||
@@ -663,6 +713,29 @@ def test_ai_consult_sidebar_loads_patient_facts_and_reports(
|
||||
dialog.close()
|
||||
|
||||
|
||||
def test_missing_server_analysis_is_not_presented_as_ai_diagnosis(
|
||||
application: QApplication,
|
||||
) -> None:
|
||||
dialog = AiConsultDialog(
|
||||
DemoDoctorRepository(), PermissionSet(["tcm.diagnosis/aiAssistant"])
|
||||
)
|
||||
dialog._seed = {
|
||||
"clinical_diagnosis": "糖尿病",
|
||||
"fasting_blood_sugar": 11.2,
|
||||
}
|
||||
dialog._render_analysis({})
|
||||
dialog.show()
|
||||
application.processEvents()
|
||||
|
||||
titles = [
|
||||
widget.text()
|
||||
for widget in dialog.findChildren(QLabel, "AiConsultRecordTitle")
|
||||
]
|
||||
assert titles == ["分析状态"]
|
||||
assert not dialog.findChildren(QTextBrowser, "AiConsultBubbleText")
|
||||
dialog.close()
|
||||
|
||||
|
||||
def test_ai_consult_sidebar_survives_chat_archive_errors(
|
||||
application: QApplication,
|
||||
immediate_async: None,
|
||||
|
||||
@@ -53,6 +53,7 @@ def test_windows_one_click_entrypoints_and_release_pipeline() -> None:
|
||||
release_launcher = read("packaging/windows/start_release.bat")
|
||||
|
||||
assert run_script.index("$FrozenExecutable") < run_script.index("Find-Uv")
|
||||
assert run_script.index('Write-Host "Using current source tree:') < run_script.index('Write-Host "Using packaged application:')
|
||||
assert "& $Uv sync --frozen" in run_script
|
||||
assert '"UV_CACHE_DIR"' in run_script
|
||||
assert "$ProjectUvCache" in run_script
|
||||
|
||||
@@ -0,0 +1,145 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
|
||||
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
||||
|
||||
from PySide6.QtCore import Qt, QTimer
|
||||
from PySide6.QtWidgets import QApplication, QDialog, QMainWindow
|
||||
|
||||
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_owner_synchronized_business_drawers_use_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),
|
||||
OrderDetailDrawer(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 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()
|
||||
Reference in New Issue
Block a user