fix: 任务执行前检查 Android 设备连接 (#84)
This commit is contained in:
@@ -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"},
|
||||
|
||||
Reference in New Issue
Block a user