157 lines
5.6 KiB
Python
157 lines
5.6 KiB
Python
"""Real prescription pages append server pages without losing row actions."""
|
|
|
|
import os
|
|
|
|
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
|
from types import SimpleNamespace
|
|
|
|
import pytest
|
|
from PySide6.QtCore import Qt
|
|
from PySide6.QtTest import QTest
|
|
from PySide6.QtWidgets import QApplication
|
|
|
|
from doctor_workstation.ui.pages import prescription_library, prescriptions
|
|
|
|
|
|
@pytest.fixture(scope="module")
|
|
def app():
|
|
return QApplication.instance() or QApplication([])
|
|
|
|
|
|
def inline(function, *, on_success, on_error, on_finished):
|
|
try:
|
|
result = function()
|
|
except Exception as error:
|
|
on_error(error)
|
|
else:
|
|
on_success(result)
|
|
finally:
|
|
on_finished()
|
|
|
|
|
|
class Repository:
|
|
def __init__(self):
|
|
self.calls = []
|
|
|
|
def get(self, **q):
|
|
self.calls.append(dict(q))
|
|
start = (q["page_no"] - 1) * q["page_size"]
|
|
return {
|
|
"lists": [
|
|
{
|
|
"id": i,
|
|
"prescription_name": f"Template {i}",
|
|
"sn": f"RX{i}",
|
|
"patient_name": f"Patient {i}",
|
|
"creator_id": 1,
|
|
"is_public": False,
|
|
"efficacy": "清热祛湿" if i > 15 else "益气养阴",
|
|
"herbs": [],
|
|
"create_time": "2026-09-01 10:00",
|
|
}
|
|
for i in range(start + 1, min(start + q["page_size"], 37) + 1)
|
|
],
|
|
"count": 37,
|
|
"extend": {"doctors": [{"id": 1, "name": "Doctor"}]},
|
|
}
|
|
|
|
list_prescriptions = get
|
|
list_prescription_templates = get
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"module,cls",
|
|
[
|
|
(prescriptions, prescriptions.PrescriptionsPage),
|
|
(prescription_library, prescription_library.PrescriptionLibraryPage),
|
|
],
|
|
)
|
|
def test_scroll_append_refresh_and_filter_reset(app, monkeypatch, module, cls):
|
|
monkeypatch.setattr(module, "run_async", inline)
|
|
repo = Repository()
|
|
page = cls(repo, {"*"}, SimpleNamespace(id=1, root=1, role_ids=[]))
|
|
page.resize(1250, 760)
|
|
page.show()
|
|
page.refresh()
|
|
# Let deferred filter/table geometry settle before scrolling its real viewport.
|
|
for _ in range(3):
|
|
app.processEvents()
|
|
QTest.qWait(35)
|
|
assert page.table.rowCount() == 15
|
|
page.table.selectRow(4)
|
|
before_id = page.table.current_data()["id"]
|
|
page.table.verticalScrollBar().setValue(page.table.verticalScrollBar().maximum())
|
|
for _ in range(50):
|
|
if page.table.rowCount() == 30:
|
|
break
|
|
QTest.qWait(20)
|
|
assert page.table.rowCount() == 30 and page.table.current_data()["id"] == before_id
|
|
assert (
|
|
len({page.table.item(r, 0).data(Qt.ItemDataRole.UserRole)["id"] for r in range(30)}) == 30
|
|
)
|
|
page.refresh()
|
|
assert page.table.rowCount() == 30
|
|
assert [q["page_no"] for q in repo.calls[-2:]] == [1, 2]
|
|
page.table.verticalScrollBar().setValue(page.table.verticalScrollBar().maximum())
|
|
QTest.qWait(90)
|
|
assert page.table.rowCount() == 37 and not page.pager.has_more
|
|
edit = page.name_filter if module is prescription_library else page.patient_filter
|
|
edit.setText("changed")
|
|
page._search()
|
|
assert page.table.rowCount() == 15 and repo.calls[-1]["page_no"] == 1
|
|
assert page.pager.height() == 24 and page.layout().contentsMargins().bottom() == 8
|
|
page.close()
|
|
|
|
|
|
def test_local_effect_filter_continues_until_matching_rows_are_visible(app, monkeypatch):
|
|
monkeypatch.setattr(prescription_library, "run_async", inline)
|
|
page = prescription_library.PrescriptionLibraryPage(
|
|
Repository(), {"*"}, SimpleNamespace(id=1, root=1, role_ids=[])
|
|
)
|
|
page.resize(1250, 760)
|
|
page.show()
|
|
page.effect_filter.setCurrentIndex(page.effect_filter.findData("清热祛湿"))
|
|
page._search()
|
|
QTest.qWait(180)
|
|
assert page.table.rowCount() >= 15
|
|
assert page.table.item(0, 0).data(Qt.ItemDataRole.UserRole)["id"] > 15
|
|
page.close()
|
|
|
|
|
|
def test_audit_status_sort_keeps_actions_on_the_visible_prescription(app, monkeypatch):
|
|
from PySide6.QtWidgets import QPushButton
|
|
|
|
monkeypatch.setattr(prescriptions, "run_async", inline)
|
|
|
|
class AuditRepository(Repository):
|
|
def get(self, **query):
|
|
result = super().get(**query)
|
|
for row in result["lists"]:
|
|
identifier = row["id"]
|
|
row.update(
|
|
audit_status=identifier % 3,
|
|
audit_remark="rejected reason" if identifier % 3 == 2 else "",
|
|
business_prescription_audit_rejected=identifier % 2 == 0,
|
|
business_prescription_audit_remark="business reason"
|
|
if identifier % 2 == 0
|
|
else "",
|
|
)
|
|
return result
|
|
|
|
list_prescriptions = get
|
|
|
|
page = prescriptions.PrescriptionsPage(AuditRepository(), {"*"}, SimpleNamespace(id=1))
|
|
page.refresh()
|
|
opened = []
|
|
page._view_selected = lambda: opened.append(page.table.current_data()["id"])
|
|
page.table.sortItems(6, Qt.SortOrder.DescendingOrder)
|
|
page.pager.load_more()
|
|
page.refresh()
|
|
assert page.table.rowCount() == 30
|
|
for row in range(page.table.rowCount()):
|
|
expected = page.table.item(row, 0).data(Qt.ItemDataRole.UserRole)["id"]
|
|
buttons = page.table.cellWidget(row, 2).findChildren(QPushButton)
|
|
next(button for button in buttons if button.accessibleName() == "查看处方").click()
|
|
assert opened[-1] == expected
|
|
page.close()
|