feat: 执行并提交 PDD 采集任务 (#32)
This commit is contained in:
@@ -12,7 +12,7 @@ os.environ.setdefault("QT_QPA_PLATFORM", "offscreen")
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
|
||||
from src.pdd_ui import PDDTaskPage
|
||||
from src.admin_gateway import AdminTask
|
||||
from src.admin_gateway import AdminTask, SubmissionReceipt
|
||||
from src.pdd_ui_event import (
|
||||
PDDTaskPageEvent,
|
||||
admin_task_to_new_claimed_task,
|
||||
@@ -38,6 +38,12 @@ class BrokenSaveRepository(BrokenRepository):
|
||||
def add_claimed_task(self, _task):
|
||||
raise RuntimeError("disk is full")
|
||||
|
||||
def next_pending_outbox(self):
|
||||
return None
|
||||
|
||||
def next_collect_task(self):
|
||||
return None
|
||||
|
||||
|
||||
class RecordingClaimGateway:
|
||||
"""记录领取参数并返回预设结果。"""
|
||||
@@ -52,6 +58,12 @@ class RecordingClaimGateway:
|
||||
self.thread_ids.append(threading.get_ident())
|
||||
return self.response
|
||||
|
||||
def submit_result(self, task_id, idempotency_key, result):
|
||||
return SubmissionReceipt(True, "RESULT-001", "2026-08-07T08:00:00Z")
|
||||
|
||||
def submit_failure(self, task_id, idempotency_key, failure):
|
||||
return SubmissionReceipt(True, "FAILURE-001", "2026-08-07T08:00:00Z")
|
||||
|
||||
|
||||
class SlowClaimGateway(RecordingClaimGateway):
|
||||
"""让关闭测试能稳定发生在 HTTP 返回之前。"""
|
||||
@@ -66,6 +78,28 @@ class SlowClaimGateway(RecordingClaimGateway):
|
||||
return super().claim_next(client, capabilities)
|
||||
|
||||
|
||||
class FakeCollectResult:
|
||||
def to_pdd_data(self):
|
||||
return {
|
||||
"schema_version": 1,
|
||||
"goods_id": "737116531267",
|
||||
"title": "测试商品",
|
||||
"shop_name": "测试店铺",
|
||||
"price_granularity": "color",
|
||||
"dimensions": [],
|
||||
"skus": [{"price_cent": 990}],
|
||||
}
|
||||
|
||||
|
||||
class FakeCollector:
|
||||
def collect(self, _task):
|
||||
return FakeCollectResult()
|
||||
|
||||
|
||||
def fake_collect_factory(*_args):
|
||||
return FakeCollector()
|
||||
|
||||
|
||||
def collect_admin_task(task_id="COL-001"):
|
||||
return AdminTask(
|
||||
task_id=task_id,
|
||||
@@ -246,6 +280,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
self.repository,
|
||||
claim_gateway=gateway,
|
||||
settings_repository=self._saved_settings(),
|
||||
collect_service_factory=fake_collect_factory,
|
||||
)
|
||||
|
||||
page.autoFetchRequested.emit()
|
||||
@@ -276,6 +311,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
self.repository,
|
||||
claim_gateway=gateway,
|
||||
settings_repository=self._saved_settings(),
|
||||
collect_service_factory=fake_collect_factory,
|
||||
)
|
||||
|
||||
page.autoFetchRequested.emit()
|
||||
@@ -295,6 +331,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
self.repository,
|
||||
claim_gateway=gateway,
|
||||
settings_repository=self._saved_settings(),
|
||||
collect_service_factory=fake_collect_factory,
|
||||
)
|
||||
|
||||
page.autoFetchRequested.emit()
|
||||
@@ -316,12 +353,14 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
self.repository,
|
||||
claim_gateway=gateway,
|
||||
settings_repository=self._saved_settings(),
|
||||
collect_service_factory=fake_collect_factory,
|
||||
)
|
||||
|
||||
page.autoFetchRequested.emit()
|
||||
|
||||
self.assertTrue(wait_until(self.app, lambda: not events._claim_busy))
|
||||
self.assertIn("本地已有", page.statusLabel.text())
|
||||
self.assertIn("采集完成", page.statusLabel.text())
|
||||
self.assertEqual(gateway.calls, [])
|
||||
self.assertEqual(self.repository.count_tasks(), 1)
|
||||
events.shutdown()
|
||||
page.deleteLater()
|
||||
@@ -334,6 +373,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
BrokenSaveRepository(),
|
||||
claim_gateway=gateway,
|
||||
settings_repository=self._saved_settings(),
|
||||
collect_service_factory=fake_collect_factory,
|
||||
)
|
||||
|
||||
page.autoFetchRequested.emit()
|
||||
@@ -371,6 +411,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
self.repository,
|
||||
claim_gateway=gateway,
|
||||
settings_repository=self._saved_settings(),
|
||||
collect_service_factory=fake_collect_factory,
|
||||
)
|
||||
page.autoFetchRequested.emit()
|
||||
self.assertTrue(wait_until(self.app, gateway.started.is_set))
|
||||
|
||||
Reference in New Issue
Block a user