feat: annuleren taak toegevoegd

This commit is contained in:
kodi
2026-03-15 13:06:48 +01:00
parent 7d910479f9
commit a52493459a
32 changed files with 835 additions and 61 deletions
@@ -109,6 +109,38 @@ class TaskRecoveryServiceTest(unittest.TestCase):
self.assertEqual(task["status"], "failed")
self.assertEqual(task["error_code"], "task_interrupted")
def test_reconcile_persisted_incomplete_tasks_marks_stale_cancelling_task_failed(self) -> None:
self.task_repo.insert_task_for_testing(
{
"id": "task-cancelling",
"operation": "duplicate",
"status": "cancelling",
"source": "2 items",
"destination": "same directory",
"created_at": "2026-03-10T10:00:00Z",
"started_at": "2026-03-10T10:00:01Z",
"current_item": "storage1/report.txt",
}
)
self.history_repo.create_entry(
entry_id="task-cancelling",
operation="duplicate",
status="queued",
source="2 items",
destination="same directory",
created_at="2026-03-10T10:00:00Z",
)
changed = reconcile_persisted_incomplete_tasks(self.task_repo, self.history_repo)
self.assertEqual(changed, ["task-cancelling"])
task = self.task_repo.get_task("task-cancelling")
self.assertEqual(task["status"], "failed")
self.assertEqual(task["error_code"], "task_interrupted")
history = self.history_repo.list_history(limit=5)[0]
self.assertEqual(history["id"], "task-cancelling")
self.assertEqual(history["status"], "failed")
if __name__ == "__main__":
unittest.main()
@@ -107,6 +107,68 @@ class TaskRepositoryTest(unittest.TestCase):
self.assertEqual(task["status"], "cancelled")
self.assertIsNotNone(task["finished_at"])
def test_request_cancellation_moves_running_file_task_to_cancelling(self) -> None:
created = self.repo.create_task(
operation="copy",
source="storage1/docs/a.txt",
destination="storage1/docs-copy/a.txt",
)
self.repo.mark_running(
created["id"],
done_items=0,
total_items=2,
current_item="storage1/docs/a.txt",
)
task = self.repo.request_cancellation(created["id"])
self.assertIsNotNone(task)
self.assertEqual(task["status"], "cancelling")
self.assertEqual(task["current_item"], "storage1/docs/a.txt")
self.assertIsNone(task["finished_at"])
def test_request_cancellation_moves_queued_file_task_to_cancelled(self) -> None:
created = self.repo.create_task(
operation="delete",
source="storage1/docs/a.txt",
destination="",
)
task = self.repo.request_cancellation(created["id"])
self.assertIsNotNone(task)
self.assertEqual(task["status"], "cancelled")
self.assertIsNone(task["current_item"])
self.assertIsNotNone(task["finished_at"])
def test_finalize_cancelled_transitions_cancelling_task(self) -> None:
created = self.repo.create_task(
operation="move",
source="storage1/docs/a.txt",
destination="storage1/archive/a.txt",
)
self.repo.mark_running(
created["id"],
done_items=0,
total_items=3,
current_item="storage1/docs/a.txt",
)
self.repo.request_cancellation(created["id"])
changed = self.repo.finalize_cancelled(
created["id"],
done_items=1,
total_items=3,
)
task = self.repo.get_task(created["id"])
self.assertTrue(changed)
self.assertEqual(task["status"], "cancelled")
self.assertEqual(task["done_items"], 1)
self.assertEqual(task["total_items"], 3)
self.assertIsNone(task["current_item"])
self.assertIsNotNone(task["finished_at"])
def test_reconcile_incomplete_tasks_marks_non_terminal_failed(self) -> None:
self.repo.insert_task_for_testing(
{