This commit is contained in:
Your Name
2026-09-07 10:07:47 +08:00
parent cf3fbdc5ef
commit d5164b7369
388 changed files with 19863 additions and 18720 deletions
+49 -37
View File
@@ -7,7 +7,7 @@ from typing import Any
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
import pytest
from PySide6.QtCore import QDate, QPoint
from PySide6.QtCore import QDate, QPoint, QRect
from PySide6.QtWidgets import QApplication, QDialogButtonBox, QInputDialog, QLabel
from doctor_workstation.core import PermissionSet
@@ -175,6 +175,8 @@ def test_patient_refresh_generation_ignores_late_results(
monkeypatch.setattr(patients_module, "run_async", queue_async)
workspace = PatientListWorkspace(SimpleNamespace(), PermissionSet(["*"]))
workspace.refresh()
# Identical in-flight queries coalesce; a changed query starts a new generation.
workspace.keyword_edit.setText("新结果")
workspace.refresh()
newer = {
"lists": [{"id": 2, "diagnosis_id": 2, "patient_name": "新结果"}],
@@ -621,62 +623,72 @@ def test_patient_list_reference_geometry_and_row_actions(
repository = DemoDoctorRepository()
session = repository.login(repository.DEMO_ACCOUNT, repository.DEMO_PASSWORD)
page = PatientsPage(repository, permissions=session.permissions, current_user=session.user)
# 1366x768 shell minus its 170 px patient rail, 26 px outer gutter,
# and 62 px top bar leaves a 1170x680 page viewport.
page.resize(1170, 680)
page.filter_disclosure.set_expanded(True)
# Patient pages use the approved 208 px rail and 76 px top bar.
page.resize(1536 - 208, 960 - 76)
page.show()
application.processEvents()
page.patient_workspace.refresh()
application.processEvents()
workspace = page.patient_workspace
assert page.header.height() == 62
assert workspace.filter_card.height() <= 92
assert all(
button.minimumHeight() == 44 and button.maximumHeight() == 44
for button in workspace.summary_buttons.values()
)
assert workspace.keyword_edit.objectName() == "PatientKeywordInput"
assert workspace.status_host.objectName() == "PatientStatusFilterHost"
assert workspace.quick_host.objectName() == "PatientQuickDateHost"
assert workspace.date_host.objectName() == "PatientDateRangeHost"
assert (
workspace.keyword_edit.maximumWidth(),
workspace.status_host.maximumWidth(),
workspace.quick_host.maximumWidth(),
workspace.date_host.maximumWidth(),
) == (620, 440, 620, 420)
assert workspace.search_button.objectName() == "PatientSearchButton"
assert workspace.reset_button.objectName() == "PatientResetButton"
assert workspace.custom_date_button.objectName() == "PatientCustomDateButton"
for width in (1170, 1290, 1514):
page.resize(width, 680)
application.processEvents()
for widget in (
workspace.keyword_edit,
workspace.status_host,
workspace.search_button,
workspace.reset_button,
workspace.quick_host,
workspace.date_host,
workspace.custom_date_button,
assert workspace.table.rowCount() == 4
assert workspace.table.rowViewportPosition(3) + workspace.table.rowHeight(3) <= workspace.table.viewport().height()
assert workspace.table.horizontalScrollBar().maximum() == 0
assert workspace.pager.summary_label.text() == "共 4 条 · 已全部加载"
assert workspace.pager.height() == 24
assert workspace.pager.page_size == 15
assert workspace.pager.page == 1
assert not workspace.pager.has_more
for width, height in ((1536, 960), (1366, 768), (1024, 640)):
page.resize(width - 208, height - 76)
for _ in range(3):
application.processEvents()
assert page.header.height() >= page.header.minimumSizeHint().height()
for host, widgets in (
(workspace.search_toolbar, (workspace.keyword_edit, workspace.search_button, workspace.reset_button)),
(workspace.filter_card, (workspace.status_host, workspace.quick_host, workspace.date_host, workspace.custom_date_button)),
(workspace.status_host, tuple(workspace.status_buttons.values())),
(workspace.quick_host, tuple(workspace.quick_buttons.values())),
(workspace.date_host, (workspace.start_date, workspace.end_date)),
(workspace.summary_strip, tuple(workspace.summary_buttons.values())),
):
top_left = widget.mapTo(workspace.filter_card, QPoint(0, 0))
assert top_left.x() >= 0
assert top_left.x() + widget.width() <= workspace.filter_card.width()
assert all(button.maximumWidth() == 420 for button in workspace.summary_buttons.values())
for widget in widgets:
assert widget.isVisibleTo(page)
assert host.rect().contains(QRect(widget.mapTo(host, QPoint()), widget.size())), widget.objectName()
for host in (workspace.search_toolbar, workspace.filter_card, workspace.summary_strip, workspace.pager):
if workspace.content.isAncestorOf(host):
workspace.scroll.ensureWidgetVisible(host, 0, 0)
application.processEvents()
assert workspace.scroll.viewport().rect().contains(QRect(host.mapTo(workspace.scroll.viewport(), QPoint()), host.size())), host.objectName()
else:
assert page.rect().contains(QRect(host.mapTo(page, QPoint()), host.size())), host.objectName()
assert workspace.pager.isVisibleTo(page)
workspace.table.scrollToBottom()
application.processEvents()
assert workspace.table.rowViewportPosition(3) + workspace.table.rowHeight(3) <= workspace.table.viewport().height()
assert page.tabs.minimumHeight() == 0
assert workspace.content_stack.minimumHeight() == 0
assert workspace.table.minimumHeight() == 0
assert workspace.bottom_actions.isHidden()
assert workspace.table.viewport().height() // 36 >= 6
assert workspace.pager.isVisibleTo(page)
assert workspace.table.objectName() == "PatientTable"
assert workspace.table.columnCount() == 10
assert workspace.table.horizontalHeaderItem(9).text() == "操作"
if workspace.table.rowCount():
assert workspace.table.rowHeight(0) == 36
assert workspace.table.cellWidget(0, 0) is not None
assert workspace.table.cellWidget(0, 9) is not None
assert workspace.table.horizontalHeader().visualIndex(9) == 9
assert all(not workspace.table.isColumnHidden(column) for column in range(10))
actions = workspace.table.cellWidget(0, 9)
assert workspace.table.rowHeight(0) >= max(40, actions.minimumSizeHint().height() + 1)
for button in [*actions.buttons, actions.more_button]:
if button is not None:
assert actions.rect().contains(button.geometry())
assert workspace.table.cellWidget(0, 0) is not None
assert workspace.table.cellWidget(0, 9) is not None
page.close()
application.processEvents()