From 2daa09032c6a91e9086819170abc754dfd4ffd3f Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Wed, 5 Aug 2026 05:14:22 +0200 Subject: [PATCH] refactor: share download result status response --- core/services/download_service.py | 17 +++++++++-------- tests/test_download_routes.py | 25 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/core/services/download_service.py b/core/services/download_service.py index ffabb06..5c03f29 100644 --- a/core/services/download_service.py +++ b/core/services/download_service.py @@ -265,19 +265,22 @@ class DownloadService: self.cancel_download_fn(download_id) return self.web.json_response({"success": True}) + def _json_result_with_success_status(self, result): + """Return a JSON result using HTTP status 200/400 from its success flag.""" + status = 200 if result.get("success") else 400 + return self.web.json_response(result, status=status) + async def pause_download(self, request): """Pause an aria2 download.""" download_id = request.match_info["download_id"] result = self.pause_download_fn(download_id) - status = 200 if result.get("success") else 400 - return self.web.json_response(result, status=status) + return self._json_result_with_success_status(result) async def resume_download(self, request): """Resume an aria2 download.""" download_id = request.match_info["download_id"] result = self.resume_download_fn(download_id) - status = 200 if result.get("success") else 400 - return self.web.json_response(result, status=status) + return self._json_result_with_success_status(result) async def clear_completed_downloads(self, request): """Clear completed and failed downloads from progress memory.""" @@ -294,14 +297,12 @@ class DownloadService: """Start the aria2 daemon without starting a download.""" settings = await self.get_override_settings_from_request(request) result = await self.asyncio.to_thread(self.start_aria2_daemon, settings) - status = 200 if result.get("success") else 400 - return self.web.json_response(result, status=status) + return self._json_result_with_success_status(result) async def aria2_stop(self, request): """Stop the aria2 daemon started by Model Resolver.""" result = await self.asyncio.to_thread(self.stop_aria2_daemon) - status = 200 if result.get("success") else 400 - return self.web.json_response(result, status=status) + return self._json_result_with_success_status(result) async def aria2_install(self, request): """Install aria2 and persist the selected download backend.""" diff --git a/tests/test_download_routes.py b/tests/test_download_routes.py index 9d25098..443b19f 100644 --- a/tests/test_download_routes.py +++ b/tests/test_download_routes.py @@ -330,6 +330,7 @@ async def test_download_control_routes_preserve_progress_and_status_codes(): pause_handler = handlers[("POST", "/model_resolver/pause/{download_id}")] response = await pause_handler(_request(download_id="pause-1")) assert response.status == 200 + assert json.loads(response.text) == {"success": True} values["pause_download"].assert_called_once_with("pause-1") values["pause_download"].return_value = {"success": False, "error": "not aria2"} @@ -339,8 +340,14 @@ async def test_download_control_routes_preserve_progress_and_status_codes(): resume_handler = handlers[("POST", "/model_resolver/resume/{download_id}")] response = await resume_handler(_request(download_id="resume-1")) assert response.status == 200 + assert json.loads(response.text) == {"success": True} values["resume_download"].assert_called_once_with("resume-1") + values["resume_download"].return_value = {"success": False, "error": "not aria2"} + response = await resume_handler(_request(download_id="resume-2")) + assert response.status == 400 + assert json.loads(response.text) == {"success": False, "error": "not aria2"} + clear_handler = handlers[("POST", "/model_resolver/clear_completed_downloads")] response = await clear_handler(_request()) assert json.loads(response.text) == {"success": True} @@ -362,12 +369,29 @@ async def test_aria2_routes_use_override_settings_and_map_failures(): assert json.loads(response.text) == {"status": "running"} assert values["get_aria2_status"].call_count == 2 + values["start_aria2_daemon"].return_value = { + "success": True, + "message": "started", + } + response = await start_handler(_request()) + assert response.status == 200 + assert json.loads(response.text) == {"success": True, "message": "started"} + values["start_aria2_daemon"].return_value = { "success": False, "error": "cannot start", } response = await start_handler(_request()) assert response.status == 400 + assert json.loads(response.text) == {"success": False, "error": "cannot start"} + + values["stop_aria2_daemon"].return_value = { + "success": True, + "message": "stopped", + } + response = await stop_get(_request(method="GET")) + assert response.status == 200 + assert json.loads(response.text) == {"success": True, "message": "stopped"} values["stop_aria2_daemon"].return_value = { "success": False, @@ -375,6 +399,7 @@ async def test_aria2_routes_use_override_settings_and_map_failures(): } response = await stop_get(_request(method="GET")) assert response.status == 400 + assert json.loads(response.text) == {"success": False, "error": "not running"} response = await install_handler(_request({"force": True})) assert json.loads(response.text)["success"] is True