feat: 执行并提交 PDD 采集任务 (#32)

This commit is contained in:
chengma
2026-08-07 17:38:29 +08:00
parent 34b4b54b63
commit 2d1fdbea3f
17 changed files with 2156 additions and 108 deletions
+43 -2
View File
@@ -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))