feat: 增加采集任务重新执行入口 (#63)

This commit is contained in:
chengma
2026-08-09 21:44:29 +08:00
parent 72821eaaef
commit eda3661604
12 changed files with 509 additions and 27 deletions
+59 -1
View File
@@ -14,7 +14,7 @@ from src.task_models import (
TaskStatus,
TaskType,
)
from src.task_repository import DuplicateTaskError, TaskRepository
from src.task_repository import CollectRerunError, DuplicateTaskError, TaskRepository
class TaskRepositoryTests(unittest.TestCase):
@@ -209,6 +209,64 @@ class TaskRepositoryTests(unittest.TestCase):
TaskStatus.SUCCEEDED,
)
def test_prepare_rerun_preserves_old_result_and_creates_new_attempt(self):
self.repository.add_claimed_task(self._task("TASK-RERUN"))
first = self.repository.start_collect_run("TASK-RERUN", "USB-001")
first_data = {"goods_id": "10001", "title": "旧标题", "skus": []}
first_event = self.repository.save_collect_result(
"TASK-RERUN", first.attempt_id, first_data
)
self.repository.mark_outbox_sent(first_event.id)
prepared = self.repository.prepare_collect_rerun("TASK-RERUN")
second = self.repository.start_collect_run("TASK-RERUN", "USB-001")
second_data = {"goods_id": "10001", "title": "新标题", "skus": []}
self.repository.save_collect_result(
"TASK-RERUN", second.attempt_id, second_data
)
connection = open_database(self.db_path)
try:
rows = connection.execute(
"SELECT attempt_id, result_data FROM task_runs"
" WHERE task_id = ? ORDER BY attempt_no",
(prepared.id,),
).fetchall()
finally:
connection.close()
self.assertEqual(second.attempt_no, 2)
self.assertIn("旧标题", rows[0]["result_data"])
self.assertIn("新标题", rows[1]["result_data"])
self.assertEqual(self.repository.get_task("TASK-RERUN").title, "新标题")
def test_rerun_rejects_purchase_active_and_unsent_tasks(self):
self.repository.add_claimed_task(
self._task("PURCHASE-RERUN", TaskType.PURCHASE)
)
with self.assertRaisesRegex(CollectRerunError, "采购任务"):
self.repository.validate_collect_rerun("PURCHASE-RERUN")
self.repository.add_claimed_task(self._task("ACTIVE-RERUN"))
with self.assertRaisesRegex(CollectRerunError, "待执行"):
self.repository.validate_collect_rerun("ACTIVE-RERUN")
self.repository.add_claimed_task(self._task("UNSENT-RERUN"))
started = self.repository.start_collect_run("UNSENT-RERUN", "USB-001")
self.repository.save_collect_result(
"UNSENT-RERUN", started.attempt_id, {"title": "结果", "skus": []}
)
connection = open_database(self.db_path)
try:
with connection:
connection.execute(
"UPDATE pdd_tasks SET status = 'failed'"
" WHERE remote_task_id = 'UNSENT-RERUN'"
)
finally:
connection.close()
with self.assertRaisesRegex(CollectRerunError, "未发送"):
self.repository.validate_collect_rerun("UNSENT-RERUN")
def test_recovery_restores_sending_and_interrupted_running(self):
self.repository.add_claimed_task(self._task("TASK-RECOVER"))
started = self.repository.start_collect_run("TASK-RECOVER", "USB-001")