diff --git a/supervisor/api/backups.py b/supervisor/api/backups.py index 169819f3364..0e50b687de1 100644 --- a/supervisor/api/backups.py +++ b/supervisor/api/backups.py @@ -46,7 +46,7 @@ CoreState, ) from ..coresys import CoreSysAttributes -from ..exceptions import APIError, APIForbidden +from ..exceptions import APIError, APIForbidden, APINotFound from ..jobs import JobSchedulerOptions from ..mounts.const import MountUsage from ..resolution.const import UnhealthyReason @@ -134,7 +134,7 @@ def _extract_slug(self, request): """Return backup, throw an exception if it doesn't exist.""" backup = self.sys_backups.get(request.match_info.get("slug")) if not backup: - raise APIError("Backup does not exist") + raise APINotFound("Backup does not exist") return backup def _list_backups(self): diff --git a/supervisor/exceptions.py b/supervisor/exceptions.py index 0120b1d1f47..550bf26d0e5 100644 --- a/supervisor/exceptions.py +++ b/supervisor/exceptions.py @@ -336,6 +336,12 @@ class APIForbidden(APIError): status = 403 +class APINotFound(APIError): + """API not found error.""" + + status = 404 + + class APIAddonNotInstalled(APIError): """Not installed addon requested at addons API.""" diff --git a/tests/api/test_backups.py b/tests/api/test_backups.py index 53eacd2b10e..757a41d2e00 100644 --- a/tests/api/test_backups.py +++ b/tests/api/test_backups.py @@ -729,3 +729,21 @@ async def test_upload_duplicate_backup_new_location( ".cloud_backup": copy_backup, } assert coresys.backups.get("7fed74c8").location is None + + +@pytest.mark.parametrize( + ("method", "url"), + [ + ("get", "/backups/bad/info"), + ("delete", "/backups/bad"), + ("post", "/backups/bad/restore/full"), + ("post", "/backups/bad/restore/partial"), + ("get", "/backups/bad/download"), + ], +) +async def test_backup_not_found(api_client: TestClient, method: str, url: str): + """Test backup not found error.""" + resp = await api_client.request(method, url) + assert resp.status == 404 + resp = await resp.json() + assert resp["message"] == "Backup does not exist"