feat(ai-studio): make original downloads nonblocking

This commit is contained in:
chengma
2026-07-11 17:28:37 +08:00
parent 4e552ea19b
commit 879a3fe5cc
5 changed files with 726 additions and 45 deletions
+53
View File
@@ -1,5 +1,7 @@
import os
import unittest
from types import SimpleNamespace
from unittest import mock
os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
@@ -14,6 +16,7 @@ from PySide6.QtCore import QEventLoop, QTimer
from PySide6.QtWidgets import QApplication
from app.workers import BaseWorker, run_worker
from app.gui.workers import ImageStudioDownloadOriginalWorker
class DemoWorker(BaseWorker):
@@ -112,6 +115,56 @@ class WorkerTests(unittest.TestCase):
with self.assertRaises(TypeError):
run_worker(object(), start=False)
def test_image_studio_original_download_retries_twice_without_raw_error(self):
worker = ImageStudioDownloadOriginalWorker(
12,
max_retries=2,
retry_delays=(0, 0),
)
progress = []
logs = []
worker.progress.connect(lambda payload: progress.append(dict(payload)))
worker.log.connect(logs.append)
successful_asset = SimpleNamespace(id=12)
with mock.patch(
"app.gui.workers.image_studio_images.download_original_asset",
side_effect=[RuntimeError("first"), RuntimeError("second"), successful_asset],
) as download:
summary = worker.execute()
self.assertEqual(3, download.call_count)
self.assertIs(successful_asset, summary["asset"])
retries = [payload for payload in progress if payload.get("state") == "retry"]
self.assertEqual(
[
{"asset_id": 12, "state": "retry", "retry": 1, "max_retries": 2, "delay_seconds": 0.0},
{"asset_id": 12, "state": "retry", "retry": 2, "max_retries": 2, "delay_seconds": 0.0},
],
retries,
)
self.assertTrue(any("重试 1/2" in message for message in logs))
self.assertTrue(any("重试 2/2" in message for message in logs))
self.assertFalse(any("first" in message or "second" in message for message in logs))
def test_image_studio_original_download_returns_chinese_final_failure(self):
worker = ImageStudioDownloadOriginalWorker(
12,
max_retries=2,
retry_delays=(0, 0),
)
with mock.patch(
"app.gui.workers.image_studio_images.download_original_asset",
side_effect=RuntimeError("https://example.invalid/private"),
) as download:
summary = worker.execute()
self.assertEqual(3, download.call_count)
self.assertFalse(summary["ok"])
self.assertEqual("蝦皮原主图下载失败,请稍后再次点击图片重试。", summary["error"])
self.assertNotIn("https://", summary["error"])
if __name__ == "__main__":
unittest.main()