feat: 安全继续失败采购核单 (#262)
This commit is contained in:
@@ -608,8 +608,76 @@ class TaskRepositoryTests(unittest.TestCase):
|
||||
)
|
||||
|
||||
self.assertEqual(plan.eligible_task_ids, ())
|
||||
self.assertEqual(plan.reconcile_task_ids, ())
|
||||
self.assertIn("只准核对订单", plan.blocked[0][1])
|
||||
|
||||
def test_purchase_rerun_plan_separates_safe_reconcile_retry(self):
|
||||
self.repository.add_claimed_task(
|
||||
self._task("PURCHASE-RECONCILE", TaskType.PURCHASE)
|
||||
)
|
||||
started = self.repository.start_purchase_run(
|
||||
"PURCHASE-RECONCILE", "USB-001"
|
||||
)
|
||||
irreversible_at = "2026-08-11T00:00:00Z"
|
||||
connection = open_database(self.db_path)
|
||||
try:
|
||||
with connection:
|
||||
connection.execute(
|
||||
"UPDATE task_runs SET run_status = 'manual_review',"
|
||||
" current_step = 'reconcile_manual_review',"
|
||||
" irreversible_action_at = ?, error_code = 'ORDER_MATCH_UNCERTAIN'"
|
||||
" WHERE attempt_id = ?",
|
||||
(irreversible_at, started.attempt_id),
|
||||
)
|
||||
connection.execute(
|
||||
"UPDATE pdd_tasks SET status = 'manual_review',"
|
||||
" current_step = 'reconcile_manual_review',"
|
||||
" last_error_code = 'ORDER_MATCH_UNCERTAIN'"
|
||||
" WHERE remote_task_id = ?",
|
||||
("PURCHASE-RECONCILE",),
|
||||
)
|
||||
finally:
|
||||
connection.close()
|
||||
|
||||
plan = self.repository.plan_rerun_batch(
|
||||
("PURCHASE-RECONCILE",), TaskType.PURCHASE
|
||||
)
|
||||
|
||||
self.assertEqual(plan.eligible_task_ids, ())
|
||||
self.assertEqual(
|
||||
plan.reconcile_task_ids, ("PURCHASE-RECONCILE",)
|
||||
)
|
||||
self.assertEqual(plan.blocked, ())
|
||||
|
||||
before = self.repository.latest_task_run("PURCHASE-RECONCILE")
|
||||
prepared = self.repository.prepare_purchase_reconcile_retry(
|
||||
"PURCHASE-RECONCILE"
|
||||
)
|
||||
after = self.repository.latest_task_run("PURCHASE-RECONCILE")
|
||||
|
||||
assert before is not None and after is not None
|
||||
self.assertEqual(prepared.current_step, "reconcile_purchase")
|
||||
self.assertEqual(after.current_step, "reconcile_purchase")
|
||||
self.assertEqual(after.attempt_id, before.attempt_id)
|
||||
self.assertEqual(after.attempt_no, before.attempt_no)
|
||||
self.assertEqual(after.irreversible_action_at, irreversible_at)
|
||||
self.assertEqual(after.diagnostics_json, before.diagnostics_json)
|
||||
|
||||
def test_purchase_before_irreversible_remains_eligible_for_rerun(self):
|
||||
self.repository.add_claimed_task(
|
||||
self._task("PURCHASE-BEFORE-SUBMIT", TaskType.PURCHASE)
|
||||
)
|
||||
|
||||
plan = self.repository.plan_rerun_batch(
|
||||
("PURCHASE-BEFORE-SUBMIT",), TaskType.PURCHASE
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
plan.eligible_task_ids, ("PURCHASE-BEFORE-SUBMIT",)
|
||||
)
|
||||
self.assertEqual(plan.reconcile_task_ids, ())
|
||||
self.assertEqual(plan.blocked, ())
|
||||
|
||||
def test_retry_wait_can_rerun_only_after_failure_outbox_is_sent(self):
|
||||
self.repository.add_claimed_task(self._task("RETRY-RERUN"))
|
||||
first = self.repository.start_collect_run("RETRY-RERUN", "USB-001")
|
||||
|
||||
Reference in New Issue
Block a user