Files
zyt/app/tests/test_text_consult_ui.py
2026-09-09 15:47:48 +08:00

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