This commit is contained in:
Your Name
2026-08-18 14:08:38 +08:00
parent 8b9df1154c
commit bc1228a310
77 changed files with 10763 additions and 1181 deletions
+108 -14
View File
@@ -8,9 +8,16 @@ from typing import Any
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
import pytest
from PySide6.QtCore import QAbstractTableModel, QRect, Qt, Signal
from PySide6.QtCore import QAbstractTableModel, QPoint, QRect, Qt, Signal
from PySide6.QtGui import QColor, QImage, QPainter
from PySide6.QtWidgets import QApplication, QFrame, QToolButton, QWidget
from PySide6.QtWidgets import (
QAbstractItemView,
QApplication,
QFrame,
QSizePolicy,
QToolButton,
QWidget,
)
from doctor_workstation.core import PermissionSet
from doctor_workstation.ui.diagnosis_index_widgets import (
@@ -158,14 +165,15 @@ def test_visual_hierarchy_and_filter_contract(
page = _page()
content_layout = page.page_scroll.widget().layout()
margins = content_layout.contentsMargins()
assert (margins.left(), margins.top(), margins.right(), margins.bottom()) == (20, 18, 29, 16)
assert content_layout.spacing() == 12
assert (margins.left(), margins.top(), margins.right(), margins.bottom()) == (18, 10, 18, 10)
assert content_layout.spacing() == 8
status_card = page.findChild(QFrame, "DiagnosisStatusCard")
assert status_card is not None
assert status_card.height() == 62
assert page.page_header.height() == 62
assert status_card.height() == 50
assert page.findChild(QFrame, "DiagnosisFilterCard") is not None
assert page.findChild(QFrame, "DiagnosisListCard") is not None
assert page.filters_card.height() == 108
assert page.filters_card.height() == 90
assert page.keyword_edit.maximumWidth() == 380
assert list(page.status_buttons) == ["1", "", "4", "2", "3"]
assert page.status_buttons["1"].isChecked()
@@ -234,12 +242,17 @@ def test_dedicated_model_fixed_columns_selection_and_sort(
assert isinstance(page.table.model(), QAbstractTableModel)
assert isinstance(page.table.model(), DiagnosisTableModel)
assert page.table_host.LEFT_WIDTHS == (48, 70, 60, 100, 175, 88, 120, 100, 72, 110)
assert page.table_host.FIXED_WIDTHS == (120, 340)
assert page.table_host.fixed.width() == 462
assert page.table_host.FIXED_WIDTHS == (120, 410)
assert page.table_host.fixed.width() == 532
assert page.table.isColumnHidden(10)
assert page.table_host.fixed.isColumnHidden(9)
assert not page.table_host.fixed.isColumnHidden(10)
assert page.table.verticalScrollBarPolicy() == Qt.ScrollBarPolicy.ScrollBarAlwaysOff
assert page.table.verticalScrollBarPolicy() == Qt.ScrollBarPolicy.ScrollBarAsNeeded
assert page.table.verticalScrollMode() == QAbstractItemView.ScrollMode.ScrollPerPixel
assert page.table_host.fixed.verticalScrollMode() == QAbstractItemView.ScrollMode.ScrollPerPixel
assert page.table_host.fixed.verticalScrollBarPolicy() == Qt.ScrollBarPolicy.ScrollBarAlwaysOff
assert page.table_host.minimumHeight() == 0
assert page.table_host.sizePolicy().verticalPolicy() == QSizePolicy.Policy.Expanding
rows = [_row(501), _row(502, has_appointment=0, appointments=[])]
page.table_host.set_rows(rows)
@@ -303,6 +316,10 @@ def test_empty_loading_and_full_pager_keep_the_table_shell(
page.loading_overlay.stop()
page.pager.update_state(3, 97)
assert 40 <= page.pager.height() <= 44
pager_margins = page.pager.layout().contentsMargins()
assert pager_margins.top() >= 4
assert pager_margins.bottom() >= 4
assert [page.pager.size_combo.itemData(index) for index in range(4)] == [15, 20, 30, 40]
assert len([button for button in page.pager._page_buttons if not button.isHidden()]) == 5
assert page.pager.jumper.maximum() == 7
@@ -472,6 +489,7 @@ def test_full_more_menu_requires_each_real_repository_capability(
"view": True,
"edit": True,
"prescription": True,
"ai_consult": True,
"appointment": True,
"assign": True,
"delete": True,
@@ -612,30 +630,106 @@ def test_error_state_is_persistent_until_rows_replace_it(application: QApplicati
application.processEvents()
@pytest.mark.parametrize("size", [(1024, 640), (1440, 900)])
def test_two_desktop_sizes_scroll_vertically_without_horizontal_page_clipping(
@pytest.mark.parametrize(
("size", "minimum_visible_rows"),
[((1366, 768), 4), ((1710, 920), 7)],
)
def test_two_desktop_sizes_keep_pager_visible_and_scroll_rows_inside_table(
application: QApplication,
size: tuple[int, int],
minimum_visible_rows: int,
) -> None:
page = _page()
rows = [_row(600 + index, patient_name=f"患者{index:02d}") for index in range(15)]
rows = [
_row(
600 + index,
patient_name=f"患者{index:02d}",
latest_appointment_channel_text="健康顾问转介",
)
for index in range(40)
]
page.table_host.set_rows(rows)
page.resize(*size)
page.show()
application.processEvents()
for _ in range(4):
application.processEvents()
viewport = page.table.viewport()
visible_rows = sum(
1
for row in range(page.table_host.model.rowCount())
if (
(rect := page.table.visualRect(page.table_host.model.index(row, 0))).isValid()
and rect.top() >= 0
and rect.bottom() < viewport.height()
)
)
pager_top = page.pager.mapTo(page.page_scroll.viewport(), QPoint()).y()
assert page.page_scroll.horizontalScrollBar().maximum() == 0
assert page.page_scroll.verticalScrollBar().maximum() > 0
assert page.page_scroll.verticalScrollBar().maximum() == 0
assert pager_top >= 0
assert pager_top + page.pager.height() <= page.page_scroll.viewport().height()
assert visible_rows >= minimum_visible_rows
assert page.table.verticalScrollBar().maximum() > 0
assert page.table_host.fixed.geometry().right() <= page.table_host.rect().right()
assert page.search_button.geometry().right() <= page.search_button.parentWidget().rect().right()
page.close()
application.processEvents()
def test_frozen_rows_track_main_pixel_scroll_and_host_height_is_page_size_stable(
application: QApplication,
monkeypatch: pytest.MonkeyPatch,
) -> None:
page = _page()
rows = [
_row(
800 + index,
latest_appointment_channel_text="健康顾问转介",
)
for index in range(40)
]
page.table_host.set_rows(rows[:15])
page.resize(1366, 768)
page.show()
for _ in range(4):
application.processEvents()
host_height = page.table_host.height()
monkeypatch.setattr(page, "refresh", lambda silent=False: None)
page._change_page_size(40)
page.table_host.set_rows(rows)
for _ in range(4):
application.processEvents()
main_scroll = page.table.verticalScrollBar()
fixed_scroll = page.table_host.fixed.verticalScrollBar()
assert page.table_host.height() == host_height
assert main_scroll.maximum() == fixed_scroll.maximum()
main_scroll.setValue(main_scroll.maximum() // 2)
application.processEvents()
assert fixed_scroll.value() == main_scroll.value()
fixed_scroll.setValue(fixed_scroll.maximum() // 3)
application.processEvents()
assert main_scroll.value() == fixed_scroll.value()
center_index = page.table.indexAt(page.table.viewport().rect().center())
assert center_index.isValid()
main_top = page.table.visualRect(page.table_host.model.index(center_index.row(), 0)).top()
fixed_top = page.table_host.fixed.visualRect(
page.table_host.model.index(center_index.row(), 10)
).top()
assert main_top == fixed_top
page.close()
application.processEvents()
def test_required_reference_artifacts_exist() -> None:
root = Path(__file__).resolve().parents[1]
expected = {
root / "artifacts" / "diagnosis_visual" / "diagnosis_1024x640.png": (1024, 640),
root / "artifacts" / "diagnosis_visual" / "diagnosis_1440x900.png": (1440, 900),
root / "artifacts" / "diagnosis_visual" / "diagnosis_1366x768.png": (1366, 768),
root / "artifacts" / "diagnosis_visual" / "diagnosis_1710x920.png": (1710, 920),
root / "artifacts" / "diagnosis_visual" / "diagnosis_loading_1280x800.png": (
1280,
800,