104 lines
5.0 KiB
Python
104 lines
5.0 KiB
Python
"""Appointment medium stays attached to its own row and opens text chat without RTC."""
|
|
import os
|
|
|
|
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
|
|
|
import pytest
|
|
from PySide6.QtCore import Qt
|
|
from PySide6.QtWidgets import QApplication, QLabel, QPushButton, QToolButton
|
|
|
|
from doctor_workstation.core import PermissionSet
|
|
from doctor_workstation.core.appointment_modes import (
|
|
appointment_type_description,
|
|
appointment_type_value,
|
|
can_appointment_video,
|
|
)
|
|
from doctor_workstation.services import DemoDoctorRepository
|
|
from doctor_workstation.ui.diagnosis_index_widgets import _blue_appointment_text
|
|
from doctor_workstation.ui.pages import appointments, consultations
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def application():
|
|
return QApplication.instance() or QApplication([])
|
|
|
|
|
|
@pytest.mark.parametrize("value,label,video", [
|
|
("text", "图文问诊", False), ("video", "视频问诊", True),
|
|
(None, "视频问诊", True), (" ", "视频问诊", True),
|
|
("phone", "电话问诊", False), ("unexpected", "未知", False),
|
|
])
|
|
def test_appointment_type_never_uses_diagnosis_visit_type(value, label, video):
|
|
assert appointment_type_description(value) == label
|
|
assert can_appointment_video(value) is video
|
|
assert appointment_type_value({"appointment_type": value, "consultation_type": "复诊"}) == value or value == ""
|
|
|
|
|
|
def test_nested_type_uses_current_appointment_id_not_another_latest():
|
|
row = {"appointment_id": 12, "latest_appointment_type": "video", "appointments": [
|
|
{"id": 11, "appointment_type": "video"}, {"id": 12, "appointment_type": "text"},
|
|
]}
|
|
assert appointment_type_value(row) == "text"
|
|
assert "图文问诊" in _blue_appointment_text(row, row["appointments"][1])[1]
|
|
assert "视频问诊" in _blue_appointment_text(row, row["appointments"][0])[1]
|
|
assert appointment_type_value({"appointments": row["appointments"]}) == "unknown"
|
|
|
|
|
|
def test_appointment_text_chat_carries_exact_ids_and_blocks_video_qr(application, monkeypatch):
|
|
monkeypatch.setattr(appointments, "run_async", lambda *_a, **_kw: None)
|
|
notices = []
|
|
monkeypatch.setattr(appointments, "show_toast", lambda _parent, message, *_a: notices.append(message))
|
|
page = appointments.AppointmentsPage(DemoDoctorRepository(), PermissionSet(["*"]))
|
|
rows = [{"id": 71, "patient_id": 501, "diagnosis_id": 501, "source_patient_id": 901,
|
|
"patient_name": "图文患者", "doctor_id": 7, "status": 1, "appointment_type": "text"},
|
|
{"id": 72, "patient_id": 502, "diagnosis_id": 502, "source_patient_id": 902,
|
|
"patient_name": "视频患者", "doctor_id": 8, "status": 1, "appointment_type": "video"}]
|
|
try:
|
|
page._loaded({"lists": rows, "count": 2}, page._generation, False)
|
|
emitted = []
|
|
page.video_requested.connect(emitted.append)
|
|
page.table.sortItems(1, Qt.SortOrder.DescendingOrder)
|
|
text_row = next(i for i in range(2) if page.table.item(i, 0).data(Qt.ItemDataRole.UserRole)["id"] == 71)
|
|
button = page.table.cellWidget(text_row, 10).findChild(QPushButton, "AppointmentImConsultButton")
|
|
assert button.text() == "图文沟通" and button.isEnabled()
|
|
assert page.table.cellWidget(text_row, 4).findChild(QLabel, "AppointmentModeLabel").text() == "图文问诊"
|
|
button.click()
|
|
assert emitted[-1]["appointment_id"] == 71
|
|
assert emitted[-1]["diagnosis_id"] == 501
|
|
assert emitted[-1]["patient_id"] == 901
|
|
assert emitted[-1]["appointment_type"] == "text"
|
|
assert emitted[-1]["mode"] == "im"
|
|
assert not page.toolbar_qr_button.isEnabled()
|
|
page._request_video_qr()
|
|
assert notices[-1] == "本次挂号不支持视频问诊二维码。"
|
|
finally:
|
|
page.close()
|
|
page.deleteLater()
|
|
|
|
|
|
def test_consultation_text_entry_does_not_wait_for_live_video(application, monkeypatch):
|
|
monkeypatch.setattr(consultations, "run_async", lambda *_a, **_kw: None)
|
|
row = {"id": 501, "patient_id": 901, "patient_name": "图文患者", "has_appointment": 1,
|
|
"appointment_status": 1, "latest_appointment_id": 71,
|
|
"appointments": [{"id": 71, "status": 1, "appointment_type": "text"}],
|
|
"video_call_hint": {"state": "none"}}
|
|
page = consultations.ConsultationsPage(DemoDoctorRepository(), PermissionSet(["*"]))
|
|
try:
|
|
page.table_host.set_rows([row])
|
|
page.table.selectRow(0)
|
|
page._selection_changed()
|
|
buttons = page.table_host.findChildren(QToolButton)
|
|
text_button = next(button for button in buttons if button.text() == "图文沟通")
|
|
assert text_button.isEnabled()
|
|
assert page.video_button.isEnabled()
|
|
assert not page.video_qr_toolbar_button.isEnabled()
|
|
emitted = []
|
|
page.video_requested.connect(emitted.append)
|
|
page._request_video()
|
|
assert emitted[-1]["appointment_id"] == 71
|
|
assert emitted[-1]["appointment_type"] == "text"
|
|
assert emitted[-1]["mode"] == "im"
|
|
finally:
|
|
page.close()
|
|
page.deleteLater()
|