From 159e55296f358dd5ebf2d787aa1697fb0615b234 Mon Sep 17 00:00:00 2001 From: Josef Zweck Date: Tue, 22 Apr 2025 13:36:59 +0200 Subject: [PATCH] Make backup listing more resilient for onedrive (#143010) Co-authored-by: Erwin Douna --- homeassistant/components/onedrive/backup.py | 10 ++++++++-- tests/components/onedrive/test_backup.py | 17 ++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/onedrive/backup.py b/homeassistant/components/onedrive/backup.py index 41a244506ea..a2466384e18 100644 --- a/homeassistant/components/onedrive/backup.py +++ b/homeassistant/components/onedrive/backup.py @@ -235,8 +235,12 @@ class OneDriveBackupAgent(BackupAgent): items = await self._client.list_drive_items(self._folder_id) - async def download_backup_metadata(item_id: str) -> AgentBackup: - metadata_stream = await self._client.download_drive_item(item_id) + async def download_backup_metadata(item_id: str) -> AgentBackup | None: + try: + metadata_stream = await self._client.download_drive_item(item_id) + except OneDriveException as err: + _LOGGER.warning("Error downloading metadata for %s: %s", item_id, err) + return None metadata_json = loads(await metadata_stream.read()) return AgentBackup.from_dict(metadata_json) @@ -246,6 +250,8 @@ class OneDriveBackupAgent(BackupAgent): metadata_description_json := unescape(item.description) ): backup = await download_backup_metadata(item.id) + if backup is None: + continue metadata_description = loads(metadata_description_json) backups[backup.backup_id] = OneDriveBackup( backup=backup, diff --git a/tests/components/onedrive/test_backup.py b/tests/components/onedrive/test_backup.py index a81eb03a51c..54ec535a2fb 100644 --- a/tests/components/onedrive/test_backup.py +++ b/tests/components/onedrive/test_backup.py @@ -75,7 +75,6 @@ async def test_agents_info( async def test_agents_list_backups( hass: HomeAssistant, hass_ws_client: WebSocketGenerator, - mock_config_entry: MockConfigEntry, ) -> None: """Test agent list backups.""" @@ -105,6 +104,22 @@ async def test_agents_list_backups( ] +async def test_agents_list_backups_with_download_failure( + hass: HomeAssistant, + hass_ws_client: WebSocketGenerator, + mock_onedrive_client: MagicMock, +) -> None: + """Test agent list backups still works if one of the items fails to download.""" + mock_onedrive_client.download_drive_item.side_effect = OneDriveException("test") + client = await hass_ws_client(hass) + await client.send_json_auto_id({"type": "backup/info"}) + response = await client.receive_json() + + assert response["success"] + assert response["result"]["agent_errors"] == {} + assert response["result"]["backups"] == [] + + async def test_agents_get_backup( hass: HomeAssistant, hass_ws_client: WebSocketGenerator,