feat: feedback verbetering 03

This commit is contained in:
kodi
2026-03-15 14:16:17 +01:00
parent 492082c2b7
commit 3d82699535
10 changed files with 197 additions and 49 deletions
@@ -293,6 +293,9 @@ class FileOpsApiGoldenTest(unittest.TestCase):
detail = self._wait_task(body["task_id"])
self.assertEqual(detail["operation"], "delete")
self.assertEqual(detail["status"], "completed")
self.assertEqual(detail["done_items"], 1)
self.assertEqual(detail["total_items"], 1)
self.assertIsNone(detail["current_item"])
self.assertFalse(target.exists())
def test_delete_file_cancelled_after_current_delete_finishes(self) -> None:
@@ -330,7 +333,7 @@ class FileOpsApiGoldenTest(unittest.TestCase):
task_id = response.json()["task_id"]
self.assertTrue(blocking_fs.entered.wait(timeout=2.0))
running = self._wait_for_status(task_id, {"running"})
self.assertEqual(running["current_item"], str(self.scope / "delete_later.txt"))
self.assertEqual(running["current_item"], "delete_later.txt")
cancel_response = self._post(f"/api/tasks/{task_id}/cancel", {})
self.assertEqual(cancel_response.status_code, 200)
@@ -358,6 +361,9 @@ class FileOpsApiGoldenTest(unittest.TestCase):
detail = self._wait_task(body["task_id"])
self.assertEqual(detail["operation"], "delete")
self.assertEqual(detail["status"], "completed")
self.assertEqual(detail["done_items"], 0)
self.assertEqual(detail["total_items"], 0)
self.assertIsNone(detail["current_item"])
self.assertFalse(target.exists())
def test_delete_not_found(self) -> None:
@@ -424,6 +430,7 @@ class FileOpsApiGoldenTest(unittest.TestCase):
nested = target / "nested"
nested.mkdir()
(nested / "a.txt").write_text("a", encoding="utf-8")
(target / "b.txt").write_text("b", encoding="utf-8")
response = self._post(
"/api/files/delete",
@@ -436,8 +443,67 @@ class FileOpsApiGoldenTest(unittest.TestCase):
detail = self._wait_task(body["task_id"])
self.assertEqual(detail["operation"], "delete")
self.assertEqual(detail["status"], "completed")
self.assertEqual(detail["done_items"], 2)
self.assertEqual(detail["total_items"], 2)
self.assertIsNone(detail["current_item"])
self.assertFalse(target.exists())
def test_delete_non_empty_directory_recursive_cancelled_after_current_file_finishes(self) -> None:
blocking_fs = BlockingDeleteFilesystemAdapter()
path_guard = PathGuard({"storage1": str(self.root)})
service = FileOpsService(path_guard=path_guard, filesystem=blocking_fs)
delete_service = DeleteTaskService(
path_guard=path_guard,
repository=self.repo,
runner=TaskRunner(repository=self.repo, filesystem=blocking_fs),
)
task_service = TaskService(repository=self.repo)
async def _override_file_ops_service() -> FileOpsService:
return service
async def _override_delete_task_service() -> DeleteTaskService:
return delete_service
async def _override_task_service() -> TaskService:
return task_service
app.dependency_overrides[get_file_ops_service] = _override_file_ops_service
app.dependency_overrides[get_delete_task_service] = _override_delete_task_service
app.dependency_overrides[get_task_service] = _override_task_service
target = self.scope / "delete_recursive_later"
target.mkdir()
nested = target / "nested"
nested.mkdir()
(target / "a.txt").write_text("a", encoding="utf-8")
(nested / "b.txt").write_text("b", encoding="utf-8")
response = self._post(
"/api/files/delete",
{"path": "storage1/scope/delete_recursive_later", "recursive": True},
)
task_id = response.json()["task_id"]
self.assertTrue(blocking_fs.entered.wait(timeout=2.0))
running = self._wait_for_status(task_id, {"running"})
self.assertEqual(running["current_item"], "a.txt")
self.assertEqual(running["done_items"], 0)
self.assertEqual(running["total_items"], 2)
cancel_response = self._post(f"/api/tasks/{task_id}/cancel", {})
self.assertEqual(cancel_response.status_code, 200)
self.assertEqual(cancel_response.json()["status"], "cancelling")
blocking_fs.release.set()
detail = self._wait_task(task_id)
self.assertEqual(detail["status"], "cancelled")
self.assertEqual(detail["done_items"], 1)
self.assertEqual(detail["total_items"], 2)
self.assertFalse(target.joinpath("a.txt").exists())
self.assertTrue(target.joinpath("nested", "b.txt").exists())
self.assertTrue(target.exists())
def test_delete_invalid_path(self) -> None:
response = self._post(
"/api/files/delete",
@@ -260,7 +260,7 @@ class TasksApiGoldenTest(unittest.TestCase):
started_at="2026-03-10T10:00:01Z",
done_items=0,
total_items=1,
current_item="storage1/trash.txt",
current_item="trash.txt",
)
response = self._get("/api/tasks/task-delete")
@@ -271,7 +271,7 @@ class TasksApiGoldenTest(unittest.TestCase):
self.assertEqual(body["status"], "running")
self.assertEqual(body["done_items"], 0)
self.assertEqual(body["total_items"], 1)
self.assertEqual(body["current_item"], "storage1/trash.txt")
self.assertEqual(body["current_item"], "trash.txt")
def test_cancel_running_delete_task_returns_cancelling(self) -> None:
self._insert_task(
@@ -284,7 +284,7 @@ class TasksApiGoldenTest(unittest.TestCase):
started_at="2026-03-10T10:00:01Z",
done_items=0,
total_items=1,
current_item="storage1/trash.txt",
current_item="trash.txt",
)
response = self._post("/api/tasks/task-delete/cancel")
@@ -293,7 +293,7 @@ class TasksApiGoldenTest(unittest.TestCase):
body = response.json()
self.assertEqual(body["operation"], "delete")
self.assertEqual(body["status"], "cancelling")
self.assertEqual(body["current_item"], "storage1/trash.txt")
self.assertEqual(body["current_item"], "trash.txt")
def test_cancel_completed_task_rejected(self) -> None:
self._insert_task(