fix: 任务执行前检查 Android 设备连接 (#84)

This commit is contained in:
chengma
2026-08-10 09:35:46 +08:00
parent dee9f34035
commit e7fb06d7aa
11 changed files with 360 additions and 25 deletions
+54 -2
View File
@@ -4,7 +4,8 @@ import tempfile
import unittest
from pathlib import Path
from src.admin_gateway import AdminTask, ClientInfo
from src.android_device_service import AndroidDeviceSearchError
from src.admin_gateway import AdminTask, ClientInfo, SubmissionReceipt
from src.mock_admin_gateway import MockAdminGateway
from src.pdd_purchase_adapter import PddPurchaseAdapter, PurchasePageState
from src.task_dispatcher import TaskDispatcher, admin_task_to_new_claimed_task
@@ -102,7 +103,7 @@ class TaskDispatcherTest(unittest.TestCase):
def tearDown(self):
self.temporary.cleanup()
def _dispatcher(self, *, purchase_ready):
def _dispatcher(self, *, purchase_ready, device_checker=lambda _serial: None):
purchase_factory = None
if purchase_ready:
purchase_factory = (
@@ -117,6 +118,7 @@ class TaskDispatcherTest(unittest.TestCase):
lambda *_args: RecordingCollector(self.calls)
),
purchase_adapter_factory=purchase_factory,
device_connection_checker=device_checker,
)
def test_capability_only_includes_purchase_when_adapter_is_ready(self):
@@ -173,6 +175,56 @@ class TaskDispatcherTest(unittest.TestCase):
assert detail is not None
self.assertEqual(detail.status, TaskStatus.CLAIMED)
def test_disconnected_device_does_not_claim_new_task(self):
self.gateway.enqueue_task(purchase_task(), self.client.client_id)
def disconnected(_serial):
raise AndroidDeviceSearchError("USB Android 设备 USB-001 未连接")
with self.assertRaisesRegex(AndroidDeviceSearchError, "未连接"):
self._dispatcher(
purchase_ready=True, device_checker=disconnected
).execute_one()
self.assertEqual(self.repository.count_tasks(), 0)
def test_pending_outbox_submits_without_connected_device(self):
task = admin_task_to_new_claimed_task(
AdminTask(
"COL-OUTBOX",
TaskType.COLLECT,
1,
0,
{"goods_url": "https://example.test", "goods_id": "G"},
)
)
self.repository.add_claimed_task(task)
started = self.repository.start_collect_run("COL-OUTBOX", "USB-001")
self.repository.save_collect_result(
"COL-OUTBOX", started.attempt_id, FakeCollectResult().to_pdd_data()
)
checks = []
class AcceptGateway:
def submit_result(self, *_args):
return SubmissionReceipt(
True, "RESULT-001", "2026-08-10T08:00:00Z"
)
outcome = TaskDispatcher(
AcceptGateway(),
self.repository,
self.client,
"USB-001",
purchase_adapter_factory=(
lambda _address, _cancelled: ReadyPurchaseAdapter(self.calls)
),
device_connection_checker=lambda serial: checks.append(serial),
).execute_one()
self.assertEqual(outcome.kind, "succeeded")
self.assertEqual(checks, [])
def test_purchase_mapper_rejects_missing_or_invalid_safety_fields(self):
invalid_payloads = (
{"goods_url": "https://example.test"},