@@ -94,6 +94,9 @@ class TaskTableModelCheckTests(unittest.TestCase):
|
||||
refresh_position = layout.getItemPosition(layout.indexOf(page.refreshButton))
|
||||
rerun_position = layout.getItemPosition(layout.indexOf(page.rerunButton))
|
||||
resubmit_position = layout.getItemPosition(layout.indexOf(page.resubmitButton))
|
||||
purchase_position = layout.getItemPosition(
|
||||
layout.indexOf(page.purchaseRerunButton)
|
||||
)
|
||||
remove_position = layout.getItemPosition(layout.indexOf(page.removeButton))
|
||||
select_all_position = layout.getItemPosition(
|
||||
layout.indexOf(page.selectAllButton)
|
||||
@@ -104,8 +107,9 @@ class TaskTableModelCheckTests(unittest.TestCase):
|
||||
self.assertEqual(refresh_position[1], search_position[1] + 1)
|
||||
self.assertEqual(search_position[0], 0)
|
||||
self.assertEqual(select_all_position[0], 0)
|
||||
self.assertEqual(resubmit_position[1], rerun_position[1] + 1)
|
||||
self.assertEqual(remove_position[1], resubmit_position[1] + 1)
|
||||
self.assertEqual(rerun_position[1], resubmit_position[1] + 1)
|
||||
self.assertEqual(purchase_position[1], rerun_position[1] + 1)
|
||||
self.assertEqual(remove_position[1], purchase_position[1] + 1)
|
||||
self.assertEqual(invert_position[1], select_all_position[1] + 1)
|
||||
self.assertEqual(page.checkedCountLabel.text(), "已选 1 条")
|
||||
self.assertTrue(page.removeButton.isEnabled())
|
||||
|
||||
@@ -377,7 +377,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
self.assertEqual(row.price_cents, 3990)
|
||||
page.deleteLater()
|
||||
|
||||
def test_rerun_button_requires_exactly_one_checked_task(self):
|
||||
def test_rerun_buttons_allow_multiple_checked_tasks(self):
|
||||
self._add_task(1)
|
||||
self._add_task(2)
|
||||
page = PDDTaskPage()
|
||||
@@ -385,16 +385,19 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
events.load_initial_tasks()
|
||||
|
||||
self.assertFalse(page.rerunButton.isEnabled())
|
||||
self.assertFalse(page.purchaseRerunButton.isEnabled())
|
||||
page.taskModel.setData(
|
||||
page.taskModel.index(0, 0), Qt.Checked, Qt.CheckStateRole
|
||||
)
|
||||
self.app.processEvents()
|
||||
self.assertTrue(page.rerunButton.isEnabled())
|
||||
self.assertTrue(page.purchaseRerunButton.isEnabled())
|
||||
page.taskModel.setData(
|
||||
page.taskModel.index(1, 0), Qt.Checked, Qt.CheckStateRole
|
||||
)
|
||||
self.app.processEvents()
|
||||
self.assertFalse(page.rerunButton.isEnabled())
|
||||
self.assertTrue(page.rerunButton.isEnabled())
|
||||
self.assertTrue(page.purchaseRerunButton.isEnabled())
|
||||
events.shutdown()
|
||||
page.deleteLater()
|
||||
|
||||
@@ -748,7 +751,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
page.rerunRequested.emit("PDD-001")
|
||||
|
||||
message_box.return_value.cancelButton.setText.assert_called_once_with(
|
||||
"暂不重新采集"
|
||||
"取消"
|
||||
)
|
||||
message_box.return_value.cancelButton.setFocus.assert_called_once_with()
|
||||
self.assertFalse(events._claim_busy)
|
||||
@@ -806,7 +809,7 @@ class PDDTaskPageEventTest(unittest.TestCase):
|
||||
"取消后工作线程没有按时结束",
|
||||
)
|
||||
|
||||
self.assertEqual(page.rerunButton.text(), "重新执行")
|
||||
self.assertEqual(page.rerunButton.text(), "重新采集")
|
||||
self.assertIn("停止请求已处理", page.statusLabel.text())
|
||||
events.shutdown()
|
||||
page.deleteLater()
|
||||
|
||||
@@ -429,8 +429,10 @@ class TaskRepositoryTests(unittest.TestCase):
|
||||
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.assertEqual(
|
||||
self.repository.validate_collect_rerun("ACTIVE-RERUN").status,
|
||||
TaskStatus.CLAIMED,
|
||||
)
|
||||
|
||||
self.repository.add_claimed_task(self._task("UNSENT-RERUN"))
|
||||
started = self.repository.start_collect_run("UNSENT-RERUN", "USB-001")
|
||||
@@ -449,6 +451,46 @@ class TaskRepositoryTests(unittest.TestCase):
|
||||
with self.assertRaisesRegex(CollectRerunError, "未发送"):
|
||||
self.repository.validate_collect_rerun("UNSENT-RERUN")
|
||||
|
||||
def test_batch_rerun_plan_filters_other_task_type(self):
|
||||
self.repository.add_claimed_task(self._task("COLLECT-PLAN"))
|
||||
self.repository.add_claimed_task(
|
||||
self._task("PURCHASE-PLAN", TaskType.PURCHASE)
|
||||
)
|
||||
|
||||
plan = self.repository.plan_rerun_batch(
|
||||
("COLLECT-PLAN", "PURCHASE-PLAN"), TaskType.COLLECT
|
||||
)
|
||||
|
||||
self.assertEqual(plan.eligible_task_ids, ("COLLECT-PLAN",))
|
||||
self.assertEqual(plan.filtered_task_ids, ("PURCHASE-PLAN",))
|
||||
self.assertEqual(plan.blocked, ())
|
||||
|
||||
def test_purchase_rerun_permanently_rejects_irreversible_history(self):
|
||||
self.repository.add_claimed_task(
|
||||
self._task("PURCHASE-SAFE", TaskType.PURCHASE)
|
||||
)
|
||||
started = self.repository.start_purchase_run("PURCHASE-SAFE", "USB-001")
|
||||
connection = open_database(self.db_path)
|
||||
try:
|
||||
with connection:
|
||||
connection.execute(
|
||||
"UPDATE task_runs SET irreversible_action_at = ? WHERE attempt_id = ?",
|
||||
("2026-08-11T00:00:00Z", started.attempt_id),
|
||||
)
|
||||
connection.execute(
|
||||
"UPDATE pdd_tasks SET status = 'manual_review' WHERE remote_task_id = ?",
|
||||
("PURCHASE-SAFE",),
|
||||
)
|
||||
finally:
|
||||
connection.close()
|
||||
|
||||
plan = self.repository.plan_rerun_batch(
|
||||
("PURCHASE-SAFE",), TaskType.PURCHASE
|
||||
)
|
||||
|
||||
self.assertEqual(plan.eligible_task_ids, ())
|
||||
self.assertIn("只准核对订单", plan.blocked[0][1])
|
||||
|
||||
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