141 lines
5.6 KiB
Python
141 lines
5.6 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
|
|
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
|
|
|
import pytest
|
|
from PySide6.QtCore import QDate, QPoint, Qt
|
|
from PySide6.QtTest import QTest
|
|
from PySide6.QtWidgets import QApplication
|
|
|
|
from doctor_workstation.core import PermissionSet
|
|
from doctor_workstation.ui.pages import reception as reception_module
|
|
from doctor_workstation.ui.pages.reception import ReceptionPage
|
|
from doctor_workstation.ui.theme import apply_theme
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def application():
|
|
app = QApplication.instance() or QApplication([])
|
|
apply_theme(app)
|
|
return app
|
|
|
|
|
|
def settle(application):
|
|
for _ in range(8):
|
|
application.processEvents()
|
|
|
|
|
|
@pytest.fixture
|
|
def page(application, monkeypatch):
|
|
monkeypatch.setattr(reception_module, "run_async", lambda *_args, **_kwargs: None)
|
|
widget = ReceptionPage(object(), PermissionSet(["*"]))
|
|
widget.resize(1280, 800)
|
|
widget.show()
|
|
widget.poll_timer.stop()
|
|
widget.detail_stack.setCurrentIndex(1)
|
|
settle(application)
|
|
yield widget
|
|
widget.close()
|
|
widget.deleteLater()
|
|
settle(application)
|
|
|
|
|
|
def test_default_fold_reclaims_queue_space_and_keeps_clinical_workspace(page, application):
|
|
assert not page.filter_disclosure.expanded
|
|
assert page.filter_disclosure.button.text() == "展开筛选"
|
|
assert page.refresh_button.isVisible()
|
|
assert page.queue_filter_summary.isVisible()
|
|
assert not page.queue_filter_panel.isVisible()
|
|
assert not page.queue_date_button.isVisible()
|
|
assert not page.search_edit.isVisible()
|
|
assert all(not button.isVisible() for button in page._queue_filter_buttons.values())
|
|
assert page.detail_tabs.isVisible()
|
|
assert page.patient_name_label.isVisible()
|
|
assert page.clinical_info_group.isVisible()
|
|
clinical_geometry = page.detail_stack.geometry()
|
|
collapsed_height = page.queue_stack.height()
|
|
|
|
QTest.mouseClick(page.filter_disclosure.button, Qt.MouseButton.LeftButton)
|
|
settle(application)
|
|
assert page.filter_disclosure.expanded
|
|
assert page.filter_disclosure.button.text() == "收起筛选"
|
|
assert page.queue_date_button.isVisible()
|
|
assert page.search_edit.isVisible()
|
|
assert all(button.isVisible() for button in page._queue_filter_buttons.values())
|
|
assert collapsed_height - page.queue_stack.height() >= 64
|
|
assert page.detail_stack.geometry() == clinical_geometry
|
|
|
|
|
|
def test_toggle_keeps_queries_patient_draft_loaded_pages_and_resize_state(page, application, monkeypatch):
|
|
requests = []
|
|
monkeypatch.setattr(page, "_request_queue_page", lambda query, **options: requests.append((query, options)))
|
|
page.filter_disclosure.set_expanded(True)
|
|
page.queue_date_button._pick_date(QDate(2026, 8, 3))
|
|
page._queue_filter_buttons[None].click()
|
|
page.search_edit.setText(" 折叠测试患者 ")
|
|
QTest.keyClick(page.search_edit, Qt.Key.Key_Return)
|
|
assert requests[-1][0]["patient_name"] == "折叠测试患者"
|
|
assert requests[-1][0]["status"] is None
|
|
assert requests[-1][0]["start_date"] == requests[-1][0]["end_date"] == "2026-08-03"
|
|
assert page.queue_filter_summary.text() == "2026-08-03 · 全部状态 · 姓名已筛选"
|
|
assert "折叠测试患者" in page.queue_filter_summary.toolTip()
|
|
|
|
page._selected_appointment_id = 51
|
|
page._queue_records = [{"id": index} for index in range(1, 31)]
|
|
page._queue_page = 2
|
|
page._queue_total = 40
|
|
page.note_edit.setPlainText("尚未保存的接诊备注")
|
|
page.detail_tabs.setCurrentIndex(4)
|
|
query_snapshot = dict(page._queue_query)
|
|
request_count = len(requests)
|
|
loading = page._queue_loading
|
|
|
|
for expanded in (False, True, False):
|
|
page.filter_disclosure.set_expanded(expanded)
|
|
page.resize(816 if expanded else 1280, 800)
|
|
settle(application)
|
|
assert page.filter_disclosure.expanded is expanded
|
|
assert page.queue_filter_panel.isVisible() is expanded
|
|
assert len(requests) == request_count
|
|
assert page._selected_appointment_id == 51
|
|
assert page._queue_page == 2
|
|
assert len(page._queue_records) == 30
|
|
assert page._queue_loading is loading
|
|
assert page._queue_query == query_snapshot
|
|
assert page.search_edit.text() == " 折叠测试患者 "
|
|
assert page.note_edit.toPlainText() == "尚未保存的接诊备注"
|
|
assert page.detail_tabs.currentIndex() == 4
|
|
|
|
page.refresh(workspace_refresh=True)
|
|
assert not page.filter_disclosure.expanded
|
|
assert requests[-1][0]["patient_name"] == "折叠测试患者"
|
|
assert requests[-1][0]["status"] is None
|
|
assert requests[-1][0]["start_date"] == "2026-08-03"
|
|
assert requests[-1][0]["page_size"] == 30
|
|
assert page._selected_appointment_id == 51
|
|
|
|
|
|
@pytest.mark.parametrize("width", [816, 1280])
|
|
def test_expanded_queue_controls_fit_at_supported_page_widths(page, application, width):
|
|
page.filter_disclosure.set_expanded(True)
|
|
page.resize(width, 800)
|
|
page._update_queue_filter_counts({"extend": {"status_count": {"1": 23, "2": 11, "3": 42}}}, [])
|
|
settle(application)
|
|
panel = page.queue_panel
|
|
controls = [
|
|
page.refresh_button,
|
|
page.filter_disclosure.button,
|
|
page.queue_date_button,
|
|
page.search_edit,
|
|
*page._queue_filter_buttons.values(),
|
|
]
|
|
for widget in controls:
|
|
position = widget.mapTo(panel, QPoint())
|
|
assert position.x() >= 0
|
|
assert position.x() + widget.width() <= panel.width()
|
|
assert widget.width() >= widget.minimumSizeHint().width()
|
|
assert page.queue_date_button.geometry().right() < page.search_edit.geometry().left()
|
|
assert page.filter_disclosure.button.height() == page.search_edit.height() == 32
|