Skip to content

Commit 75cd32b

Browse files
Fix backup tests typing warnings (#141274)
1 parent 86ff540 commit 75cd32b

File tree

2 files changed

+45
-29
lines changed

2 files changed

+45
-29
lines changed

tests/components/backup/common.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from __future__ import annotations
44

5-
from collections.abc import AsyncIterator, Callable, Coroutine, Iterable
5+
from collections.abc import AsyncIterator, Buffer, Callable, Coroutine, Iterable
66
from pathlib import Path
7-
from typing import Any
7+
from typing import Any, cast
88
from unittest.mock import AsyncMock, Mock, patch
99

1010
from homeassistant.components.backup import (
@@ -16,6 +16,7 @@
1616
BackupNotFound,
1717
Folder,
1818
)
19+
from homeassistant.components.backup.backup import CoreLocalBackupAgent
1920
from homeassistant.components.backup.const import DATA_MANAGER
2021
from homeassistant.core import HomeAssistant
2122
from homeassistant.helpers.backup import async_initialize_backup
@@ -69,15 +70,15 @@ def mock_backup_agent(name: str, backups: list[AgentBackup] | None = None) -> Mo
6970

7071
async def delete_backup(backup_id: str, **kwargs: Any) -> None:
7172
"""Mock delete."""
72-
get_backup(backup_id)
73+
await get_backup(backup_id)
7374

7475
async def download_backup(backup_id: str, **kwargs: Any) -> AsyncIterator[bytes]:
7576
"""Mock download."""
7677
return aiter_from_iter((backups_data.get(backup_id, b"backup data"),))
7778

7879
async def get_backup(backup_id: str, **kwargs: Any) -> AgentBackup:
7980
"""Get a backup."""
80-
backup = next((b for b in backups if b.backup_id == backup_id), None)
81+
backup = next((b for b in _backups if b.backup_id == backup_id), None)
8182
if backup is None:
8283
raise BackupNotFound
8384
return backup
@@ -89,15 +90,15 @@ async def upload_backup(
8990
**kwargs: Any,
9091
) -> None:
9192
"""Upload a backup."""
92-
backups.append(backup)
93+
_backups.append(backup)
9394
backup_stream = await open_stream()
9495
backup_data = bytearray()
9596
async for chunk in backup_stream:
9697
backup_data += chunk
9798
backups_data[backup.backup_id] = backup_data
9899

99-
backups = backups or []
100-
backups_data: dict[str, bytes] = {}
100+
_backups = backups or []
101+
backups_data: dict[str, Buffer] = {}
101102
mock_agent = Mock(spec=BackupAgent)
102103
mock_agent.domain = TEST_DOMAIN
103104
mock_agent.name = name
@@ -113,7 +114,7 @@ async def upload_backup(
113114
side_effect=get_backup, spec_set=[BackupAgent.async_get_backup]
114115
)
115116
mock_agent.async_list_backups = AsyncMock(
116-
return_value=backups, spec_set=[BackupAgent.async_list_backups]
117+
return_value=_backups, spec_set=[BackupAgent.async_list_backups]
117118
)
118119
mock_agent.async_upload_backup = AsyncMock(
119120
side_effect=upload_backup,
@@ -160,11 +161,18 @@ async def setup_backup_integration(
160161
if LOCAL_AGENT_ID not in backups or with_hassio:
161162
return remote_agents_dict
162163

163-
agent = hass.data[DATA_MANAGER].backup_agents[LOCAL_AGENT_ID]
164+
local_agent = cast(
165+
CoreLocalBackupAgent, hass.data[DATA_MANAGER].backup_agents[LOCAL_AGENT_ID]
166+
)
164167

165168
for backup in backups[LOCAL_AGENT_ID]:
166-
await agent.async_upload_backup(open_stream=None, backup=backup)
167-
agent._loaded_backups = True
169+
await local_agent.async_upload_backup(
170+
open_stream=AsyncMock(
171+
side_effect=RuntimeError("Local agent does not open stream")
172+
),
173+
backup=backup,
174+
)
175+
local_agent._loaded_backups = True
168176

169177
return remote_agents_dict
170178

tests/components/hassio/test_backup.py

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from collections.abc import (
44
AsyncGenerator,
55
AsyncIterator,
6+
Buffer,
67
Callable,
78
Coroutine,
89
Generator,
@@ -13,7 +14,7 @@
1314
from io import StringIO
1415
import os
1516
from pathlib import PurePath
16-
from typing import Any
17+
from typing import Any, cast
1718
from unittest.mock import ANY, AsyncMock, Mock, patch
1819
from uuid import UUID
1920

@@ -341,15 +342,15 @@ def mock_backup_agent(
341342

342343
async def delete_backup(backup_id: str, **kwargs: Any) -> None:
343344
"""Mock delete."""
344-
get_backup(backup_id)
345+
await get_backup(backup_id)
345346

346347
async def download_backup(backup_id: str, **kwargs: Any) -> AsyncIterator[bytes]:
347348
"""Mock download."""
348349
return aiter_from_iter((backups_data.get(backup_id, b"backup data"),))
349350

350351
async def get_backup(backup_id: str, **kwargs: Any) -> AgentBackup:
351352
"""Get a backup."""
352-
backup = next((b for b in backups if b.backup_id == backup_id), None)
353+
backup = next((b for b in _backups if b.backup_id == backup_id), None)
353354
if backup is None:
354355
raise BackupNotFound
355356
return backup
@@ -361,15 +362,15 @@ async def upload_backup(
361362
**kwargs: Any,
362363
) -> None:
363364
"""Upload a backup."""
364-
backups.append(backup)
365+
_backups.append(backup)
365366
backup_stream = await open_stream()
366367
backup_data = bytearray()
367368
async for chunk in backup_stream:
368369
backup_data += chunk
369370
backups_data[backup.backup_id] = backup_data
370371

371-
backups = backups or []
372-
backups_data: dict[str, bytes] = {}
372+
_backups = backups or []
373+
backups_data: dict[str, Buffer] = {}
373374
mock_agent = Mock(spec=BackupAgent)
374375
mock_agent.domain = domain
375376
mock_agent.name = name
@@ -401,7 +402,7 @@ async def _setup_backup_platform(
401402
platform: BackupAgentPlatformProtocol,
402403
) -> None:
403404
"""Set up a mock domain."""
404-
mock_platform(hass, f"{domain}.backup", platform)
405+
mock_platform(hass, f"{domain}.backup", cast(Mock, platform))
405406
assert await async_setup_component(hass, domain, {})
406407
await hass.async_block_till_done()
407408

@@ -423,7 +424,7 @@ async def _setup_backup_platform(
423424
name="test",
424425
read_only=False,
425426
state=supervisor_mounts.MountState.ACTIVE,
426-
user_path="test",
427+
user_path=PurePath("test"),
427428
usage=supervisor_mounts.MountUsage.BACKUP,
428429
server="test",
429430
type=supervisor_mounts.MountType.CIFS,
@@ -441,7 +442,7 @@ async def _setup_backup_platform(
441442
name="test",
442443
read_only=False,
443444
state=supervisor_mounts.MountState.ACTIVE,
444-
user_path="test",
445+
user_path=PurePath("test"),
445446
usage=supervisor_mounts.MountUsage.MEDIA,
446447
server="test",
447448
type=supervisor_mounts.MountType.CIFS,
@@ -854,7 +855,7 @@ async def test_agents_notify_on_mount_added_removed(
854855
"with_automatic_settings": False,
855856
},
856857
filename=PurePath("Test_2025-01-30_05.42_12345678.tar"),
857-
folders={"ssl"},
858+
folders={supervisor_backups.Folder("ssl")},
858859
homeassistant_exclude_database=False,
859860
homeassistant=True,
860861
location=[LOCATION_LOCAL_STORAGE],
@@ -877,15 +878,22 @@ async def test_agents_notify_on_mount_added_removed(
877878
),
878879
(
879880
{"include_all_addons": True},
880-
replace(DEFAULT_BACKUP_OPTIONS, addons="ALL"),
881+
replace(DEFAULT_BACKUP_OPTIONS, addons=supervisor_backups.AddonSet("ALL")),
881882
),
882883
(
883884
{"include_database": False},
884885
replace(DEFAULT_BACKUP_OPTIONS, homeassistant_exclude_database=True),
885886
),
886887
(
887888
{"include_folders": ["media", "share"]},
888-
replace(DEFAULT_BACKUP_OPTIONS, folders={"media", "share", "ssl"}),
889+
replace(
890+
DEFAULT_BACKUP_OPTIONS,
891+
folders={
892+
supervisor_backups.Folder("media"),
893+
supervisor_backups.Folder("share"),
894+
supervisor_backups.Folder("ssl"),
895+
},
896+
),
889897
),
890898
(
891899
{
@@ -895,7 +903,7 @@ async def test_agents_notify_on_mount_added_removed(
895903
},
896904
replace(
897905
DEFAULT_BACKUP_OPTIONS,
898-
folders={"media"},
906+
folders={supervisor_backups.Folder("media")},
899907
homeassistant=False,
900908
homeassistant_exclude_database=True,
901909
),
@@ -1251,11 +1259,11 @@ async def test_reader_writer_create_per_agent_encryption(
12511259
hass_ws_client: WebSocketGenerator,
12521260
freezer: FrozenDateTimeFactory,
12531261
supervisor_client: AsyncMock,
1254-
commands: dict[str, Any],
1262+
commands: list[dict[str, Any]],
12551263
password: str | None,
12561264
agent_ids: list[str],
12571265
password_sent_to_supervisor: str | None,
1258-
create_locations: list[str | None],
1266+
create_locations: list[str],
12591267
create_protected: bool,
12601268
upload_locations: list[str | None],
12611269
) -> None:
@@ -1270,7 +1278,7 @@ async def test_reader_writer_create_per_agent_encryption(
12701278
name=f"share{i}",
12711279
read_only=False,
12721280
state=supervisor_mounts.MountState.ACTIVE,
1273-
user_path=f"share{i}",
1281+
user_path=PurePath(f"share{i}"),
12741282
usage=supervisor_mounts.MountUsage.BACKUP,
12751283
server=f"share{i}",
12761284
type=supervisor_mounts.MountType.CIFS,
@@ -1996,7 +2004,7 @@ async def test_reader_writer_restore_remote_backup(
19962004
homeassistant_version="2024.12.0",
19972005
name="Test",
19982006
protected=False,
1999-
size=0.0,
2007+
size=0,
20002008
)
20012009
remote_agent = mock_backup_agent("remote", backups=[test_backup])
20022010
await _setup_backup_platform(
@@ -2626,7 +2634,7 @@ async def test_config_load_config_info(
26262634
freezer: FrozenDateTimeFactory,
26272635
snapshot: SnapshotAssertion,
26282636
hass_storage: dict[str, Any],
2629-
storage_data: dict[str, Any] | None,
2637+
storage_data: dict[str, Any],
26302638
) -> None:
26312639
"""Test loading stored backup config and reading it via config/info."""
26322640
client = await hass_ws_client(hass)

0 commit comments

Comments
 (0)