feat(ai-studio): make original downloads nonblocking
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user