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
+66 -1
View File
@@ -104,7 +104,7 @@ class HttpAdminGatewayTest(unittest.TestCase):
},
)
)
gateway = HttpAdminGateway(opener=opener)
gateway = HttpAdminGateway(opener=opener, client_id="CLIENT-001")
gateway.register_client(
ClientInfo("CLIENT-001"), self._capabilities(False)
@@ -116,6 +116,71 @@ class HttpAdminGatewayTest(unittest.TestCase):
key.lower(): value for key, value in opener.request.header_items()
})
def test_submit_result_sends_idempotency_key_and_parses_receipt(self):
opener = RecordingOpener(
FakeResponse(
200,
{
"accepted": True,
"result_id": "RESULT-001",
"accepted_at": "2026-08-07T08:00:01Z",
},
)
)
gateway = HttpAdminGateway(opener=opener, client_id="CLIENT-001")
payload = {
"task_version": 1,
"attempt_id": "ATTEMPT-001",
"result_type": "collect",
"completed_at": "2026-08-07T08:00:00Z",
"pdd_data": {"goods_id": "123"},
}
receipt = gateway.submit_result(
"COL-001", "COL-001:ATTEMPT-001:result-v1", payload
)
self.assertTrue(receipt.accepted)
self.assertEqual(
opener.request.full_url,
"http://127.0.0.1:8080/api/v1/client/tasks/COL-001/result",
)
headers = {
key.lower(): value for key, value in opener.request.header_items()
}
self.assertEqual(
headers["idempotency-key"], "COL-001:ATTEMPT-001:result-v1"
)
self.assertEqual(headers["x-client-id"], "CLIENT-001")
self.assertEqual(json.loads(opener.request.data), payload)
def test_submit_failure_uses_failure_endpoint(self):
opener = RecordingOpener(
FakeResponse(
201,
{
"accepted": True,
"result_id": "FAILURE-001",
"accepted_at": "2026-08-07T08:00:01Z",
},
)
)
gateway = HttpAdminGateway(opener=opener, client_id="CLIENT-001")
gateway.submit_failure(
"COL-001",
"COL-001:ATTEMPT-001:failure-v1",
{
"task_version": 1,
"attempt_id": "ATTEMPT-001",
"status": "manual_review",
"error": {"code": "PDD_PAGE_CAPTCHA"},
"reported_at": "2026-08-07T08:00:00Z",
},
)
self.assertTrue(opener.request.full_url.endswith("/COL-001/failure"))
def test_claim_maps_real_admin_payload_and_only_reports_collect(self):
opener = RecordingOpener(
FakeResponse(