更新bug
This commit is contained in:
@@ -10,7 +10,14 @@ from typing import Any
|
||||
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
||||
|
||||
import pytest
|
||||
from PySide6.QtWidgets import QAbstractItemView, QApplication, QDialog, QDialogButtonBox, QLabel
|
||||
from PySide6.QtWidgets import (
|
||||
QAbstractItemView,
|
||||
QApplication,
|
||||
QDialog,
|
||||
QDialogButtonBox,
|
||||
QLabel,
|
||||
QPushButton,
|
||||
)
|
||||
|
||||
from doctor_workstation.core.errors import ApiProtocolError
|
||||
from doctor_workstation.core.models import Appointment, PageResult
|
||||
@@ -188,6 +195,106 @@ def test_diagnosis_and_patient_ids_stay_distinct_for_video() -> None:
|
||||
)
|
||||
assert prescription_action_label(pending) == "编辑处方"
|
||||
|
||||
historical_only = Appointment.from_dict(
|
||||
{
|
||||
"id": 104,
|
||||
"prescription_audit_status": 1,
|
||||
"prescription_void_status": 0,
|
||||
"has_prescription": 1,
|
||||
"current_has_prescription": 0,
|
||||
"current_prescription_id": 0,
|
||||
}
|
||||
)
|
||||
assert prescription_action_label(historical_only) == "开方"
|
||||
|
||||
|
||||
def test_appointment_view_intent_never_degrades_to_edit(
|
||||
application: QApplication,
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
row = {
|
||||
"id": 101,
|
||||
"appointment_id": 101,
|
||||
"diagnosis_id": 501,
|
||||
"current_has_prescription": 1,
|
||||
"current_prescription_id": 81,
|
||||
"prescription_audit_status": 1,
|
||||
"prescription_void_status": 0,
|
||||
}
|
||||
page = AppointmentsPage(SimpleNamespace(), permissions=PermissionSet(["*"]))
|
||||
monkeypatch.setattr(page, "_current_row", lambda: row)
|
||||
requested: list[tuple[Any, str]] = []
|
||||
monkeypatch.setattr(
|
||||
page,
|
||||
"_begin_prescription_load",
|
||||
lambda source, *, mode="open": requested.append((source, mode)),
|
||||
)
|
||||
page._open_prescription()
|
||||
assert requested == [(row, "view")]
|
||||
|
||||
monkeypatch.setattr(
|
||||
page,
|
||||
"_open_existing_prescription_editor",
|
||||
lambda _existing: pytest.fail("view intent must never open the editor"),
|
||||
)
|
||||
page._prescription_loaded(
|
||||
{
|
||||
"id": 81,
|
||||
"appointment_id": 101,
|
||||
"audit_status": 2,
|
||||
"void_status": 0,
|
||||
},
|
||||
row,
|
||||
page._prescription_generation,
|
||||
"view",
|
||||
)
|
||||
assert "状态已变化" in page.banner.label.text()
|
||||
page.close()
|
||||
application.processEvents()
|
||||
|
||||
|
||||
def test_appointment_im_action_opens_chat_without_an_existing_live_call(
|
||||
application: QApplication,
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
page = AppointmentsPage(
|
||||
DemoDoctorRepository(),
|
||||
permissions=PermissionSet(["doctor.appointment/prescription"]),
|
||||
)
|
||||
row = {
|
||||
"id": 101,
|
||||
"appointment_id": 101,
|
||||
"diagnosis_id": 501,
|
||||
"patient_id": 501,
|
||||
"source_patient_id": 301,
|
||||
"patient_name": "测试患者",
|
||||
"status": 1,
|
||||
}
|
||||
emitted: list[dict[str, Any]] = []
|
||||
monkeypatch.setattr(page, "_current_row", lambda: row)
|
||||
page.video_requested.connect(emitted.append)
|
||||
|
||||
page._request_video()
|
||||
|
||||
assert len(emitted) == 1
|
||||
assert emitted[0]["mode"] == "im"
|
||||
assert emitted[0]["appointment_id"] == 101
|
||||
assert emitted[0]["diagnosis_id"] == 501
|
||||
assert emitted[0]["patient_id"] == 301
|
||||
|
||||
warnings: list[str] = []
|
||||
monkeypatch.setattr(
|
||||
appointments_module,
|
||||
"show_toast",
|
||||
lambda _parent, message, _kind: warnings.append(message),
|
||||
)
|
||||
row["status"] = 2
|
||||
page._request_video()
|
||||
assert len(emitted) == 1
|
||||
assert warnings == ["已取消的挂号不可进入 IM 问诊。"]
|
||||
page.close()
|
||||
application.processEvents()
|
||||
|
||||
|
||||
def test_appointment_pending_prescription_uses_full_edit_contract(
|
||||
application: QApplication,
|
||||
@@ -508,15 +615,20 @@ def test_appointment_ai_report_button_visible_with_reception_permission(
|
||||
application.processEvents()
|
||||
|
||||
|
||||
def test_appointments_reference_split_layout_and_video_list(
|
||||
def test_appointments_use_full_width_table_with_per_row_im_consult(
|
||||
application: QApplication,
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
) -> None:
|
||||
monkeypatch.setattr(appointments_module, "run_async", lambda *_args, **_kwargs: object())
|
||||
page = AppointmentsPage(
|
||||
DemoDoctorRepository(),
|
||||
permissions=PermissionSet(["doctor.appointment/lists"]),
|
||||
permissions=PermissionSet(
|
||||
["doctor.appointment/lists", "doctor.appointment/prescription"]
|
||||
),
|
||||
current_user={"id": 1001, "role_id": 1},
|
||||
)
|
||||
page.resize(1460, 820)
|
||||
page.show()
|
||||
page._apply_responsive_layout()
|
||||
page._loaded(
|
||||
{
|
||||
@@ -524,6 +636,7 @@ def test_appointments_reference_split_layout_and_video_list(
|
||||
{
|
||||
"id": 101,
|
||||
"diagnosis_id": 501,
|
||||
"source_patient_id": 301,
|
||||
"patient_name": "赵俊霞",
|
||||
"gender": 0,
|
||||
"age": 53,
|
||||
@@ -532,6 +645,7 @@ def test_appointments_reference_split_layout_and_video_list(
|
||||
"appointment_time": "09:50",
|
||||
"status": 1,
|
||||
"status_desc": "已挂号",
|
||||
"video_call_hint": {"state": "live", "label": "视频通话进行中"},
|
||||
}
|
||||
],
|
||||
"count": 1,
|
||||
@@ -541,32 +655,143 @@ def test_appointments_reference_split_layout_and_video_list(
|
||||
)
|
||||
application.processEvents()
|
||||
|
||||
assert page.video_list.count() == 1
|
||||
assert "赵俊霞" in page.video_list.item(0).text()
|
||||
assert 300 <= page.video_panel.width() <= 420
|
||||
assert page.content_layout.count() == 1
|
||||
assert not hasattr(page, "video_panel")
|
||||
assert not hasattr(page, "video_list")
|
||||
assert page.table_card.width() == page.content_host.width()
|
||||
assert page.table.objectName() == "AppointmentTable"
|
||||
assert (
|
||||
page.table.verticalScrollMode()
|
||||
== QAbstractItemView.ScrollMode.ScrollPerPixel
|
||||
)
|
||||
assert (
|
||||
page.video_list.verticalScrollMode()
|
||||
== QAbstractItemView.ScrollMode.ScrollPerPixel
|
||||
)
|
||||
assert page.table.horizontalHeaderItem(10).text() == "IM 问诊"
|
||||
im_host = page.table.cellWidget(0, 10)
|
||||
assert im_host is not None
|
||||
im_button = im_host.findChild(QPushButton, "AppointmentImConsultButton")
|
||||
assert im_button is not None
|
||||
assert im_button.text() == "IM 问诊"
|
||||
assert im_button.isEnabled()
|
||||
assert im_button.accessibleName() == "与赵俊霞进行 IM 问诊"
|
||||
emitted: list[dict[str, Any]] = []
|
||||
page.video_requested.connect(emitted.append)
|
||||
im_button.click()
|
||||
assert emitted and emitted[0]["mode"] == "im"
|
||||
assert emitted[0]["appointment_id"] == 101
|
||||
assert page.date_buttons["today"].isChecked()
|
||||
|
||||
page.resize(1024, 640)
|
||||
page._apply_responsive_layout()
|
||||
assert page.video_panel.isHidden()
|
||||
assert not page.video_panel_button.isHidden()
|
||||
application.processEvents()
|
||||
assert page.table_card.width() == page.content_host.width()
|
||||
assert not page.date_overflow_button.isHidden()
|
||||
assert page.date_buttons["yesterday"].isHidden()
|
||||
assert not page.date_buttons["today"].isHidden()
|
||||
page.video_panel_button.click()
|
||||
assert not page.video_panel.isHidden()
|
||||
assert 250 <= page.video_panel.width() <= 300
|
||||
page.video_panel_button.click()
|
||||
assert page.video_panel.isHidden()
|
||||
page.close()
|
||||
application.processEvents()
|
||||
|
||||
|
||||
def test_im_entry_does_not_require_a_live_video_hint(
|
||||
application: QApplication,
|
||||
) -> None:
|
||||
page = AppointmentsPage(
|
||||
DemoDoctorRepository(),
|
||||
permissions=PermissionSet(["doctor.appointment/prescription"]),
|
||||
)
|
||||
rows = [
|
||||
{
|
||||
"id": 101,
|
||||
"diagnosis_id": 501,
|
||||
"source_patient_id": 301,
|
||||
"patient_name": "已接通患者",
|
||||
"status": 1,
|
||||
"video_call_hint": {"state": "ended", "label": "视频通话已结束"},
|
||||
},
|
||||
{
|
||||
"id": 102,
|
||||
"diagnosis_id": 502,
|
||||
"source_patient_id": 302,
|
||||
"patient_name": "等待患者",
|
||||
"status": 1,
|
||||
},
|
||||
]
|
||||
page._loaded({"lists": rows, "count": 2}, page._generation, False)
|
||||
application.processEvents()
|
||||
|
||||
buttons = [
|
||||
page.table.cellWidget(index, 10).findChild(
|
||||
QPushButton,
|
||||
"AppointmentImConsultButton",
|
||||
)
|
||||
for index in range(page.table.rowCount())
|
||||
]
|
||||
buttons_by_name = {
|
||||
button.accessibleName(): button for button in buttons if button is not None
|
||||
}
|
||||
assert set(buttons_by_name) == {
|
||||
"与已接通患者进行 IM 问诊",
|
||||
"与等待患者进行 IM 问诊",
|
||||
}
|
||||
assert buttons_by_name["与已接通患者进行 IM 问诊"].isEnabled()
|
||||
waiting = buttons_by_name["与等待患者进行 IM 问诊"]
|
||||
assert waiting.isEnabled()
|
||||
assert waiting.toolTip() == "打开患者 IM,可发送消息并从会话中发起视频"
|
||||
page.close()
|
||||
application.processEvents()
|
||||
|
||||
|
||||
def test_im_entry_allows_fulfillable_statuses_and_rejects_terminal_or_unknown_statuses(
|
||||
application: QApplication,
|
||||
) -> None:
|
||||
page = AppointmentsPage(
|
||||
DemoDoctorRepository(),
|
||||
permissions=PermissionSet(["doctor.appointment/prescription"]),
|
||||
)
|
||||
rows = [
|
||||
{
|
||||
"id": index + 100,
|
||||
"diagnosis_id": index + 500,
|
||||
"source_patient_id": index + 300,
|
||||
"patient_name": name,
|
||||
"status": status,
|
||||
}
|
||||
for index, (name, status) in enumerate(
|
||||
(
|
||||
("已预约患者", 1),
|
||||
("已过号患者", 4),
|
||||
("已取消患者", 2),
|
||||
("已完成患者", 3),
|
||||
("未知状态患者", 0),
|
||||
)
|
||||
)
|
||||
]
|
||||
page._loaded({"lists": rows, "count": len(rows)}, page._generation, False)
|
||||
application.processEvents()
|
||||
|
||||
buttons = {
|
||||
button.accessibleName(): button
|
||||
for row_index in range(page.table.rowCount())
|
||||
if (
|
||||
button := page.table.cellWidget(row_index, 10).findChild(
|
||||
QPushButton,
|
||||
"AppointmentImConsultButton",
|
||||
)
|
||||
)
|
||||
is not None
|
||||
}
|
||||
assert buttons["与已预约患者进行 IM 问诊"].isEnabled()
|
||||
assert buttons["与已过号患者进行 IM 问诊"].isEnabled()
|
||||
assert not buttons["与已取消患者进行 IM 问诊"].isEnabled()
|
||||
assert buttons["与已取消患者进行 IM 问诊"].toolTip() == (
|
||||
"已取消的挂号不可进入 IM 问诊"
|
||||
)
|
||||
assert not buttons["与已完成患者进行 IM 问诊"].isEnabled()
|
||||
assert buttons["与已完成患者进行 IM 问诊"].toolTip() == (
|
||||
"已完成的挂号不可再进入 IM 问诊"
|
||||
)
|
||||
assert not buttons["与未知状态患者进行 IM 问诊"].isEnabled()
|
||||
assert buttons["与未知状态患者进行 IM 问诊"].toolTip() == (
|
||||
"当前挂号状态不可进入 IM 问诊"
|
||||
)
|
||||
page.close()
|
||||
application.processEvents()
|
||||
|
||||
@@ -601,19 +826,20 @@ def test_identical_appointment_poll_keeps_existing_cell_widgets(
|
||||
page._loaded(result, page._generation, True)
|
||||
selector = page.table.cellWidget(0, 0)
|
||||
appointment_info = page.table.cellWidget(0, 4)
|
||||
video_card = page.video_list.itemWidget(page.video_list.item(0))
|
||||
im_action = page.table.cellWidget(0, 10)
|
||||
|
||||
page._loaded(deepcopy(result), page._generation, True)
|
||||
|
||||
assert page.table.cellWidget(0, 0) is selector
|
||||
assert page.table.cellWidget(0, 4) is appointment_info
|
||||
assert page.video_list.itemWidget(page.video_list.item(0)) is video_card
|
||||
assert page.table.cellWidget(0, 10) is im_action
|
||||
|
||||
changed = deepcopy(result)
|
||||
changed["lists"][0]["assistant_name"] = "新医助"
|
||||
page._loaded(changed, page._generation, True)
|
||||
assert page.table.cellWidget(0, 0) is not selector
|
||||
assert page.table.cellWidget(0, 4) is not appointment_info
|
||||
assert page.table.cellWidget(0, 10) is not im_action
|
||||
page.close()
|
||||
application.processEvents()
|
||||
|
||||
@@ -665,11 +891,11 @@ def test_appointments_density_fits_four_rows_in_1366_shell_viewport(
|
||||
assert all(60 <= height <= 66 for height in heights)
|
||||
assert page.table.viewport().height() // max(heights) >= 4
|
||||
assert page.pager.isVisibleTo(page)
|
||||
assert 300 <= page.video_panel.width() < 420
|
||||
assert page.content_layout.count() == 1
|
||||
assert page.table_card.width() == page.content_host.width()
|
||||
|
||||
page.resize(1024, 640)
|
||||
application.processEvents()
|
||||
assert page.video_panel.isHidden()
|
||||
assert not page.video_panel_button.isHidden()
|
||||
assert page.table_card.width() == page.content_host.width()
|
||||
page.close()
|
||||
application.processEvents()
|
||||
|
||||
Reference in New Issue
Block a user