fix: 修复重新上报任务状态不一致 (#91)

This commit is contained in:
chengma
2026-08-10 11:18:06 +08:00
parent d81aa25b13
commit 077cba6831
7 changed files with 352 additions and 27 deletions
+91 -2
View File
@@ -234,7 +234,96 @@ class TaskRepositoryTests(unittest.TestCase):
self.assertEqual(latest.id, result.id)
self.assertEqual(latest.event_type, OutboxEventType.COLLECT_RESULT)
self.assertNotEqual(latest.id, failure.id)
self.assertEqual(
self.repository.outbox_for_resubmit("TASK-REPORT").id,
failure.id,
)
self.repository.mark_outbox_sent(failure.id)
self.assertEqual(
self.repository.outbox_for_resubmit("TASK-REPORT").id,
result.id,
)
self.assertIsNone(self.repository.latest_result_outbox("MISSING"))
self.assertIsNone(self.repository.outbox_for_resubmit("MISSING"))
def test_replaying_old_result_does_not_hide_latest_failure(self):
self.repository.add_claimed_task(self._task("TASK-STATE"))
first = self.repository.start_collect_run("TASK-STATE", "USB-001")
result = self.repository.save_collect_result(
"TASK-STATE",
first.attempt_id,
{"goods_id": "10001", "title": "旧结果", "skus": []},
)
self.repository.mark_outbox_sent(result.id)
self.repository.prepare_collect_rerun("TASK-STATE")
second = self.repository.start_collect_run("TASK-STATE", "USB-001")
failure = self.repository.save_collect_failure(
"TASK-STATE",
second.attempt_id,
TaskStatus.FAILED,
"SKU_PANEL_NOT_FOUND",
"规格面板加载超时",
False,
)
self.repository.mark_outbox_sending(result.id)
self.repository.mark_outbox_sent(result.id)
detail = self.repository.get_task("TASK-STATE")
self.assertEqual(detail.status, TaskStatus.FAILED)
self.assertEqual(detail.last_error_code, "SKU_PANEL_NOT_FOUND")
# 模拟旧版本已经把主状态错误改成“已完成”。发送最新失败信息后
# 应当依据最新执行记录恢复,而不是继续保留假完成状态。
connection = open_database(self.db_path)
try:
with connection:
connection.execute(
"UPDATE pdd_tasks SET status = 'succeeded',"
" current_step = 'completed' WHERE remote_task_id = ?",
("TASK-STATE",),
)
finally:
connection.close()
self.repository.mark_outbox_sending(failure.id)
self.repository.mark_outbox_sent(failure.id)
repaired = self.repository.get_task("TASK-STATE")
self.assertEqual(repaired.status, TaskStatus.FAILED)
self.assertEqual(repaired.current_step, "failed")
self.assertEqual(repaired.last_error_message, "规格面板加载超时")
def test_replaying_old_failure_does_not_override_new_success(self):
self.repository.add_claimed_task(self._task("TASK-NEW-SUCCESS"))
first = self.repository.start_collect_run(
"TASK-NEW-SUCCESS", "USB-001"
)
old_failure = self.repository.save_collect_failure(
"TASK-NEW-SUCCESS",
first.attempt_id,
TaskStatus.FAILED,
"OLD_FAILURE",
"旧执行失败",
False,
)
self.repository.mark_outbox_sent(old_failure.id)
self.repository.prepare_collect_rerun("TASK-NEW-SUCCESS")
second = self.repository.start_collect_run(
"TASK-NEW-SUCCESS", "USB-001"
)
new_result = self.repository.save_collect_result(
"TASK-NEW-SUCCESS",
second.attempt_id,
{"goods_id": "10001", "title": "新结果", "skus": []},
)
self.repository.mark_outbox_sent(new_result.id)
self.repository.mark_outbox_sending(old_failure.id)
self.repository.mark_outbox_sent(old_failure.id)
detail = self.repository.get_task("TASK-NEW-SUCCESS")
self.assertEqual(detail.status, TaskStatus.SUCCEEDED)
self.assertEqual(detail.current_step, "completed")
def test_prepare_rerun_preserves_old_result_and_creates_new_attempt(self):
self.repository.add_claimed_task(self._task("TASK-RERUN"))
@@ -306,7 +395,7 @@ class TaskRepositoryTests(unittest.TestCase):
True,
)
with self.assertRaisesRegex(CollectRerunError, "未发送"):
with self.assertRaisesRegex(CollectRerunError, "未上报的失败信息"):
self.repository.validate_collect_rerun("RETRY-RERUN")
self.repository.mark_outbox_sent(event.id)
@@ -332,7 +421,7 @@ class TaskRepositoryTests(unittest.TestCase):
self.repository.mark_outbox_failed(event.id, "任务不存在")
with self.assertRaisesRegex(
CollectRerunError, "上次结果提交失败:任务不存在"
CollectRerunError, "上次失败信息提交失败:任务不存在"
):
self.repository.validate_collect_rerun("RETRY-REJECTED")