mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Add test helper for creating a mocked backup agent (#138294)
* Add test helper for creating a mocked backup agent * Address review comments
This commit is contained in:
parent
10180cd464
commit
8b3421deb7
@ -13,6 +13,7 @@ from homeassistant.components.backup import (
|
|||||||
AgentBackup,
|
AgentBackup,
|
||||||
BackupAgent,
|
BackupAgent,
|
||||||
BackupAgentPlatformProtocol,
|
BackupAgentPlatformProtocol,
|
||||||
|
BackupNotFound,
|
||||||
Folder,
|
Folder,
|
||||||
)
|
)
|
||||||
from homeassistant.components.backup.const import DATA_MANAGER
|
from homeassistant.components.backup.const import DATA_MANAGER
|
||||||
@ -134,6 +135,37 @@ class BackupAgentTest(BackupAgent):
|
|||||||
"""Delete a backup file."""
|
"""Delete a backup file."""
|
||||||
|
|
||||||
|
|
||||||
|
def mock_backup_agent(name: str, backups: list[AgentBackup] | None = None) -> Mock:
|
||||||
|
"""Create a mock backup agent."""
|
||||||
|
|
||||||
|
async def get_backup(backup_id: str, **kwargs: Any) -> AgentBackup | None:
|
||||||
|
"""Get a backup."""
|
||||||
|
return next((b for b in backups if b.backup_id == backup_id), None)
|
||||||
|
|
||||||
|
backups = backups or []
|
||||||
|
mock_agent = Mock(spec=BackupAgent)
|
||||||
|
mock_agent.domain = "test"
|
||||||
|
mock_agent.name = name
|
||||||
|
mock_agent.unique_id = name
|
||||||
|
type(mock_agent).agent_id = BackupAgent.agent_id
|
||||||
|
mock_agent.async_delete_backup = AsyncMock(
|
||||||
|
spec_set=[BackupAgent.async_delete_backup]
|
||||||
|
)
|
||||||
|
mock_agent.async_download_backup = AsyncMock(
|
||||||
|
side_effect=BackupNotFound, spec_set=[BackupAgent.async_download_backup]
|
||||||
|
)
|
||||||
|
mock_agent.async_get_backup = AsyncMock(
|
||||||
|
side_effect=get_backup, spec_set=[BackupAgent.async_get_backup]
|
||||||
|
)
|
||||||
|
mock_agent.async_list_backups = AsyncMock(
|
||||||
|
return_value=backups, spec_set=[BackupAgent.async_list_backups]
|
||||||
|
)
|
||||||
|
mock_agent.async_upload_backup = AsyncMock(
|
||||||
|
spec_set=[BackupAgent.async_upload_backup]
|
||||||
|
)
|
||||||
|
return mock_agent
|
||||||
|
|
||||||
|
|
||||||
async def setup_backup_integration(
|
async def setup_backup_integration(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
with_hassio: bool = False,
|
with_hassio: bool = False,
|
||||||
|
@ -25,6 +25,7 @@ from .common import (
|
|||||||
TEST_BACKUP_ABC123,
|
TEST_BACKUP_ABC123,
|
||||||
BackupAgentTest,
|
BackupAgentTest,
|
||||||
aiter_from_iter,
|
aiter_from_iter,
|
||||||
|
mock_backup_agent,
|
||||||
setup_backup_integration,
|
setup_backup_integration,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -112,16 +113,14 @@ async def test_downloading_local_encrypted_backup(
|
|||||||
await _test_downloading_encrypted_backup(hass_client, "backup.local")
|
await _test_downloading_encrypted_backup(hass_client, "backup.local")
|
||||||
|
|
||||||
|
|
||||||
@patch.object(BackupAgentTest, "async_download_backup")
|
|
||||||
async def test_downloading_remote_encrypted_backup(
|
async def test_downloading_remote_encrypted_backup(
|
||||||
download_mock,
|
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
hass_client: ClientSessionGenerator,
|
hass_client: ClientSessionGenerator,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test downloading a local backup file."""
|
"""Test downloading a local backup file."""
|
||||||
backup_path = get_fixture_path("test_backups/c0cb53bd.tar", DOMAIN)
|
backup_path = get_fixture_path("test_backups/c0cb53bd.tar", DOMAIN)
|
||||||
await setup_backup_integration(hass)
|
await setup_backup_integration(hass)
|
||||||
hass.data[DATA_MANAGER].backup_agents["domain.test"] = BackupAgentTest(
|
mock_agent = mock_backup_agent(
|
||||||
"test",
|
"test",
|
||||||
[
|
[
|
||||||
AgentBackup(
|
AgentBackup(
|
||||||
@ -139,11 +138,12 @@ async def test_downloading_remote_encrypted_backup(
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
hass.data[DATA_MANAGER].backup_agents["domain.test"] = mock_agent
|
||||||
|
|
||||||
async def download_backup(backup_id: str, **kwargs: Any) -> AsyncIterator[bytes]:
|
async def download_backup(backup_id: str, **kwargs: Any) -> AsyncIterator[bytes]:
|
||||||
return aiter_from_iter((backup_path.read_bytes(),))
|
return aiter_from_iter((backup_path.read_bytes(),))
|
||||||
|
|
||||||
download_mock.side_effect = download_backup
|
mock_agent.async_download_backup.side_effect = download_backup
|
||||||
await _test_downloading_encrypted_backup(hass_client, "domain.test")
|
await _test_downloading_encrypted_backup(hass_client, "domain.test")
|
||||||
|
|
||||||
|
|
||||||
@ -154,9 +154,7 @@ async def test_downloading_remote_encrypted_backup(
|
|||||||
(BackupNotFound, 404),
|
(BackupNotFound, 404),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
@patch.object(BackupAgentTest, "async_download_backup")
|
|
||||||
async def test_downloading_remote_encrypted_backup_with_error(
|
async def test_downloading_remote_encrypted_backup_with_error(
|
||||||
download_mock,
|
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
hass_client: ClientSessionGenerator,
|
hass_client: ClientSessionGenerator,
|
||||||
error: Exception,
|
error: Exception,
|
||||||
@ -164,7 +162,7 @@ async def test_downloading_remote_encrypted_backup_with_error(
|
|||||||
) -> None:
|
) -> None:
|
||||||
"""Test downloading a local backup file."""
|
"""Test downloading a local backup file."""
|
||||||
await setup_backup_integration(hass)
|
await setup_backup_integration(hass)
|
||||||
hass.data[DATA_MANAGER].backup_agents["domain.test"] = BackupAgentTest(
|
mock_agent = mock_backup_agent(
|
||||||
"test",
|
"test",
|
||||||
[
|
[
|
||||||
AgentBackup(
|
AgentBackup(
|
||||||
@ -182,8 +180,9 @@ async def test_downloading_remote_encrypted_backup_with_error(
|
|||||||
)
|
)
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
hass.data[DATA_MANAGER].backup_agents["domain.test"] = mock_agent
|
||||||
|
|
||||||
download_mock.side_effect = error
|
mock_agent.async_download_backup.side_effect = error
|
||||||
client = await hass_client()
|
client = await hass_client()
|
||||||
resp = await client.get(
|
resp = await client.get(
|
||||||
"/api/backup/download/abc123?agent_id=domain.test&password=blah"
|
"/api/backup/download/abc123?agent_id=domain.test&password=blah"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user