更新
This commit is contained in:
@@ -16,6 +16,7 @@ from doctor_workstation.ui.diagnosis_drawer import (
|
||||
NotesTimeline,
|
||||
_RemoteImageButton,
|
||||
)
|
||||
from doctor_workstation.ui.diagnosis_media import ImagePreviewDialog
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
@@ -112,7 +113,6 @@ def test_remote_image_request_is_thread_owned_and_rejects_stale_results(
|
||||
object_name="DiagnosisTongueThumb",
|
||||
parent=owner,
|
||||
)
|
||||
button._manager.deleteLater()
|
||||
manager = _FakeManager(button)
|
||||
button._manager = manager
|
||||
manager.queue(_png_bytes(180, 90, "#DC2626"))
|
||||
@@ -160,7 +160,6 @@ def test_remote_image_uses_text_only_after_request_or_decode_failure(
|
||||
object_name="DiagnosisChatImage",
|
||||
parent=owner,
|
||||
)
|
||||
button._manager.deleteLater()
|
||||
manager = _FakeManager(button)
|
||||
button._manager = manager
|
||||
manager.queue(b"not-an-image")
|
||||
@@ -193,7 +192,6 @@ def test_remote_image_enforces_same_origin_redirects_and_aborts_oversize_downloa
|
||||
object_name="DiagnosisTongueThumb",
|
||||
parent=owner,
|
||||
)
|
||||
button._manager.deleteLater()
|
||||
manager = _FakeManager(button)
|
||||
button._manager = manager
|
||||
manager.queue(b"must-not-be-read")
|
||||
@@ -218,6 +216,110 @@ def test_remote_image_enforces_same_origin_redirects_and_aborts_oversize_downloa
|
||||
assert application.thread() == button.thread()
|
||||
|
||||
|
||||
def _preview_with_offline_transport(
|
||||
sources: list[str],
|
||||
*,
|
||||
index: int = 0,
|
||||
names: list[str] | None = None,
|
||||
) -> tuple[ImagePreviewDialog, _FakeManager]:
|
||||
"""Build a preview window whose downloads are driven by the test, not the network."""
|
||||
|
||||
original_request = ImagePreviewDialog._request
|
||||
ImagePreviewDialog._request = lambda self, target: None # type: ignore[method-assign]
|
||||
try:
|
||||
dialog = ImagePreviewDialog(sources, index=index, names=names)
|
||||
finally:
|
||||
ImagePreviewDialog._request = original_request # type: ignore[method-assign]
|
||||
manager = _FakeManager(dialog)
|
||||
dialog._manager = manager
|
||||
return dialog, manager
|
||||
|
||||
|
||||
def test_image_preview_pages_the_group_in_app_and_reuses_decoded_images(
|
||||
application: QApplication,
|
||||
) -> None:
|
||||
dialog, manager = _preview_with_offline_transport(
|
||||
[
|
||||
"https://media.example.invalid/tongue-1.jpg",
|
||||
"file:///C:/private/tongue.jpg",
|
||||
"https://media.example.invalid/tongue-2.jpg",
|
||||
],
|
||||
index=2,
|
||||
names=["舌象附件 1", "本地危险附件", "舌象附件 2"],
|
||||
)
|
||||
# file:// 附件既不进入分组,也不会发起任何请求。
|
||||
assert dialog.sources == [
|
||||
"https://media.example.invalid/tongue-1.jpg",
|
||||
"https://media.example.invalid/tongue-2.jpg",
|
||||
]
|
||||
assert dialog.current_source == "https://media.example.invalid/tongue-2.jpg"
|
||||
assert dialog.counter.text() == "第 2 / 2 张"
|
||||
assert dialog.name_label.text() == "舌象附件 2"
|
||||
|
||||
manager.queue(_png_bytes(320, 200, "#DC2626"))
|
||||
dialog.reload_current()
|
||||
request = manager.request_objects[-1]
|
||||
assert request.attribute(QNetworkRequest.Attribute.RedirectPolicyAttribute) == (
|
||||
QNetworkRequest.RedirectPolicy.SameOriginRedirectPolicy
|
||||
)
|
||||
manager.replies[-1].finished.emit()
|
||||
assert dialog.canvas.text() == ""
|
||||
assert not dialog.canvas.pixmap().isNull()
|
||||
|
||||
manager.queue(_png_bytes(120, 90, "#16A34A"))
|
||||
dialog.step(1)
|
||||
assert dialog.current_source == "https://media.example.invalid/tongue-1.jpg"
|
||||
manager.replies[-1].finished.emit()
|
||||
assert not dialog.canvas.pixmap().isNull()
|
||||
|
||||
dialog.step(1)
|
||||
assert dialog.current_source == "https://media.example.invalid/tongue-2.jpg"
|
||||
assert manager.requests == [
|
||||
"https://media.example.invalid/tongue-2.jpg",
|
||||
"https://media.example.invalid/tongue-1.jpg",
|
||||
]
|
||||
assert not dialog.canvas.pixmap().isNull()
|
||||
dialog.close()
|
||||
|
||||
|
||||
def test_image_preview_aborts_oversize_and_falls_back_on_undecodable_payload(
|
||||
application: QApplication,
|
||||
) -> None:
|
||||
dialog, manager = _preview_with_offline_transport(
|
||||
["https://media.example.invalid/tongue.jpg"]
|
||||
)
|
||||
manager.queue(b"must-not-be-read")
|
||||
dialog.reload_current()
|
||||
reply = manager.replies[-1]
|
||||
reply.downloadProgress.emit(dialog._MAX_IMAGE_BYTES, -1)
|
||||
assert reply.aborted is False
|
||||
reply.downloadProgress.emit(dialog._MAX_IMAGE_BYTES + 1, -1)
|
||||
assert reply.aborted is True
|
||||
reply.finished.emit()
|
||||
assert reply.read_all_calls == 0
|
||||
assert "12 MB" in dialog.canvas.text()
|
||||
|
||||
manager.queue(b"not-an-image")
|
||||
dialog.reload_current()
|
||||
manager.replies[-1].finished.emit()
|
||||
assert dialog.canvas.pixmap().isNull()
|
||||
assert "无法在工作站内预览" in dialog.canvas.text()
|
||||
dialog.close()
|
||||
|
||||
|
||||
def test_image_preview_refuses_a_group_without_any_safe_http_source(
|
||||
application: QApplication,
|
||||
) -> None:
|
||||
dialog = ImagePreviewDialog(["file:///C:/private/tongue.jpg", ""])
|
||||
assert dialog.has_images() is False
|
||||
assert dialog.sources == []
|
||||
assert dialog.current_source == ""
|
||||
assert not dialog.external_button.isEnabled()
|
||||
assert not dialog.next_button.isEnabled()
|
||||
assert "HTTP(S)" in dialog.canvas.text()
|
||||
dialog.close()
|
||||
|
||||
|
||||
def test_notes_render_cover_thumbnail_and_keep_safe_open_and_single_delete(
|
||||
application: QApplication,
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
|
||||
Reference in New Issue
Block a user