Unify aria2 pause and resume state changes

This commit is contained in:
Dariusz L
2026-08-05 06:03:55 +02:00
parent b118753a1e
commit 5f899316ce
2 changed files with 67 additions and 8 deletions
+17 -6
View File
@@ -1187,23 +1187,34 @@ def queue_aria2_desired_state(
return {"success": True, "message": message}
def pause_download(download_id: str, *, dependencies: Any = None) -> Dict[str, Any]:
"""Pause an aria2 download. Built-in Python downloads cannot be paused."""
def _set_aria2_desired_download_state(
download_id: str,
status: str,
*,
dependencies: Any = None,
) -> Dict[str, Any]:
facade = _require_dependencies(dependencies)
if download_id in facade.cancelled_downloads:
return {"success": False, "error": "Download is being cancelled"}
return facade._queue_aria2_desired_state(
download_id,
status,
)
def pause_download(download_id: str, *, dependencies: Any = None) -> Dict[str, Any]:
"""Pause an aria2 download. Built-in Python downloads cannot be paused."""
return _set_aria2_desired_download_state(
download_id,
"paused",
dependencies=dependencies,
)
def resume_download(download_id: str, *, dependencies: Any = None) -> Dict[str, Any]:
"""Resume a paused aria2 download."""
facade = _require_dependencies(dependencies)
if download_id in facade.cancelled_downloads:
return {"success": False, "error": "Download is being cancelled"}
return facade._queue_aria2_desired_state(
return _set_aria2_desired_download_state(
download_id,
"downloading",
dependencies=dependencies,
)
+50 -2
View File
@@ -3,10 +3,14 @@ import tempfile
import threading
import unittest
from types import SimpleNamespace
from unittest.mock import MagicMock, patch
from unittest.mock import MagicMock, call, patch
from core.download.api import context as downloader
from core.download.aria2_backend import recover_aria2_missing_control_file
from core.download.aria2_backend import (
pause_download,
recover_aria2_missing_control_file,
resume_download,
)
from core.download.orchestrator import find_active_download_for_path
from core.path_utils import normalize_metadata_file_path
@@ -135,6 +139,50 @@ class DownloaderBoundaryTests(unittest.TestCase):
self.assertFalse(downloader._aria2_action_error_is_ok("paused", "permission denied"))
self.assertFalse(downloader._aria2_action_error_is_ok("completed", "already paused"))
def test_pause_and_resume_queue_their_expected_aria2_states(self):
facade = SimpleNamespace(
cancelled_downloads=set(),
_queue_aria2_desired_state=MagicMock(
side_effect=lambda download_id, status: {
"success": True,
"download_id": download_id,
"status": status,
}
),
)
self.assertEqual(
{"success": True, "download_id": "pause-1", "status": "paused"},
pause_download("pause-1", dependencies=facade),
)
self.assertEqual(
{
"success": True,
"download_id": "resume-1",
"status": "downloading",
},
resume_download("resume-1", dependencies=facade),
)
facade._queue_aria2_desired_state.assert_has_calls(
[call("pause-1", "paused"), call("resume-1", "downloading")]
)
def test_pause_and_resume_reject_downloads_being_cancelled(self):
facade = SimpleNamespace(
cancelled_downloads={"cancelled-1"},
_queue_aria2_desired_state=MagicMock(),
)
self.assertEqual(
{"success": False, "error": "Download is being cancelled"},
pause_download("cancelled-1", dependencies=facade),
)
self.assertEqual(
{"success": False, "error": "Download is being cancelled"},
resume_download("cancelled-1", dependencies=facade),
)
facade._queue_aria2_desired_state.assert_not_called()
def test_aria2_missing_control_file_error_is_detected(self):
self.assertTrue(
downloader._is_aria2_missing_control_file_error(