feat: 正式采购下单前更新地址标记 (#173)
This commit is contained in:
@@ -92,11 +92,27 @@ class RecordingDryRunAdapter(PddPurchaseAdapter):
|
||||
class RecordingLiveAdapter(RecordingDryRunAdapter, PddLivePurchaseAdapter):
|
||||
"""只记录一次提交调用的 live 测试 Adapter。"""
|
||||
|
||||
def __init__(self, *, submit_error: bool = False, **kwargs) -> None:
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
submit_error: bool = False,
|
||||
address_error: bool = False,
|
||||
**kwargs,
|
||||
) -> None:
|
||||
super().__init__(**kwargs)
|
||||
self.submit_error = submit_error
|
||||
self.address_error = address_error
|
||||
self.submit_count = 0
|
||||
|
||||
def update_shipping_address(self, purchase_number: str) -> None:
|
||||
self.calls.append(("update_shipping_address", purchase_number))
|
||||
if self.address_error:
|
||||
raise PddPurchaseError(
|
||||
"PURCHASE_ADDRESS_PAGE_TIMEOUT",
|
||||
"地址页面切换超时",
|
||||
step="purchase_update_shipping_address",
|
||||
)
|
||||
|
||||
def submit_order_once(self) -> None:
|
||||
self.submit_count += 1
|
||||
self.calls.append(("submit_order_once",))
|
||||
@@ -324,6 +340,7 @@ class PurchaseTaskServiceTest(unittest.TestCase):
|
||||
|
||||
self.assertEqual(outcome.kind, "reconcile_pending")
|
||||
self.assertEqual(adapter.submit_count, 1)
|
||||
self.assertIn(("update_shipping_address", "PUR-001"), adapter.calls)
|
||||
detail = self.repository.get_task("PUR-001")
|
||||
run = self.repository.latest_task_run("PUR-001")
|
||||
self.assertEqual(detail.status, TaskStatus.MANUAL_REVIEW)
|
||||
@@ -344,6 +361,21 @@ class PurchaseTaskServiceTest(unittest.TestCase):
|
||||
run = self.repository.latest_task_run("PUR-001")
|
||||
self.assertIsNone(run.irreversible_action_at)
|
||||
|
||||
def test_live_address_failure_stops_before_irreversible(self):
|
||||
self._prepare_task(execution_mode="live")
|
||||
adapter = RecordingLiveAdapter(address_error=True)
|
||||
|
||||
outcome = self._service(adapter).execute_one_local()
|
||||
|
||||
self.assertEqual(outcome.kind, "task_failed")
|
||||
self.assertEqual(adapter.submit_count, 0)
|
||||
run = self.repository.latest_task_run("PUR-001")
|
||||
self.assertIsNone(run.irreversible_action_at)
|
||||
detail = self.repository.get_task("PUR-001")
|
||||
self.assertEqual(
|
||||
detail.last_error_code, "PURCHASE_ADDRESS_PAGE_TIMEOUT"
|
||||
)
|
||||
|
||||
def test_live_submit_error_never_retries_and_still_enters_reconcile(self):
|
||||
self._prepare_task(execution_mode="live")
|
||||
adapter = RecordingLiveAdapter(submit_error=True)
|
||||
|
||||
Reference in New Issue
Block a user