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