feat: annuleren taak toegevoegd
This commit is contained in:
@@ -49,6 +49,18 @@ class BlockingArchiveBuildFileOpsService(FileOpsService):
|
||||
super()._write_download_target_to_zip(archive, resolved_target, on_each_item=on_each_item)
|
||||
|
||||
|
||||
class BlockingCopyFilesystemAdapter(FilesystemAdapter):
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.entered = threading.Event()
|
||||
self.release = threading.Event()
|
||||
|
||||
def copy_file(self, source: str, destination: str, on_progress=None) -> None:
|
||||
self.entered.set()
|
||||
self.release.wait(timeout=2.0)
|
||||
return super().copy_file(source=source, destination=destination, on_progress=on_progress)
|
||||
|
||||
|
||||
class HistoryApiGoldenTest(unittest.TestCase):
|
||||
def setUp(self) -> None:
|
||||
self.temp_dir = tempfile.TemporaryDirectory()
|
||||
@@ -82,7 +94,7 @@ class HistoryApiGoldenTest(unittest.TestCase):
|
||||
delete_service = DeleteTaskService(path_guard=self.path_guard, repository=self.task_repo, runner=runner, history_repository=self.history_repo)
|
||||
duplicate_service = DuplicateTaskService(path_guard=self.path_guard, repository=self.task_repo, runner=runner, history_repository=self.history_repo)
|
||||
move_service = MoveTaskService(path_guard=self.path_guard, repository=self.task_repo, runner=runner, history_repository=self.history_repo)
|
||||
task_service = TaskService(repository=self.task_repo)
|
||||
task_service = TaskService(repository=self.task_repo, history_repository=self.history_repo)
|
||||
history_service = HistoryService(repository=self.history_repo)
|
||||
|
||||
async def _override_file_ops_service() -> FileOpsService:
|
||||
@@ -138,6 +150,16 @@ class HistoryApiGoldenTest(unittest.TestCase):
|
||||
time.sleep(0.02)
|
||||
self.fail('task did not reach terminal state in time')
|
||||
|
||||
def _wait_for_status(self, task_id: str, statuses: set[str], timeout_s: float = 2.0) -> dict:
|
||||
deadline = time.time() + timeout_s
|
||||
while time.time() < deadline:
|
||||
response = self._request('GET', f'/api/tasks/{task_id}')
|
||||
body = response.json()
|
||||
if body['status'] in statuses:
|
||||
return body
|
||||
time.sleep(0.02)
|
||||
self.fail(f"task did not reach one of {sorted(statuses)} in time")
|
||||
|
||||
def test_get_history_empty_list(self) -> None:
|
||||
response = self._request('GET', '/api/history')
|
||||
self.assertEqual(response.status_code, 200)
|
||||
@@ -207,6 +229,35 @@ class HistoryApiGoldenTest(unittest.TestCase):
|
||||
self.assertEqual(history[0]['source'], 'storage1/source.txt')
|
||||
self.assertEqual(history[0]['destination'], 'storage1/copied.txt')
|
||||
|
||||
def test_copy_cancelled_history_item(self) -> None:
|
||||
blocking_fs = BlockingCopyFilesystemAdapter()
|
||||
self._set_services(blocking_fs)
|
||||
(self.root1 / 'a.txt').write_text('A', encoding='utf-8')
|
||||
(self.root1 / 'b.txt').write_text('B', encoding='utf-8')
|
||||
(self.root1 / 'dest').mkdir()
|
||||
|
||||
response = self._request(
|
||||
'POST',
|
||||
'/api/files/copy',
|
||||
{'sources': ['storage1/a.txt', 'storage1/b.txt'], 'destination_base': 'storage1/dest'},
|
||||
)
|
||||
|
||||
task_id = response.json()['task_id']
|
||||
self.assertTrue(blocking_fs.entered.wait(timeout=2.0))
|
||||
self._wait_for_status(task_id, {'running'})
|
||||
cancel_response = self._request('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')
|
||||
history = self._request('GET', '/api/history').json()['items']
|
||||
self.assertEqual(history[0]['operation'], 'copy')
|
||||
self.assertEqual(history[0]['status'], 'cancelled')
|
||||
self.assertEqual(history[0]['source'], '2 items')
|
||||
self.assertEqual(history[0]['destination'], 'storage1/dest')
|
||||
|
||||
def test_move_failed_history_item(self) -> None:
|
||||
src = self.root1 / 'source.txt'
|
||||
src.write_text('hello', encoding='utf-8')
|
||||
@@ -334,6 +385,7 @@ class HistoryApiGoldenTest(unittest.TestCase):
|
||||
cancel = self._request('POST', f"/api/files/download/archive/{response.json()['task_id']}/cancel")
|
||||
release.set()
|
||||
self._wait_task(response.json()['task_id'])
|
||||
time.sleep(0.05)
|
||||
history = self._request('GET', '/api/history').json()['items']
|
||||
|
||||
self.assertEqual(cancel.status_code, 200)
|
||||
|
||||
Reference in New Issue
Block a user