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:
Erik Montnemery 2025-02-11 16:21:24 +01:00 committed by GitHub
parent 10180cd464
commit 8b3421deb7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 39 additions and 8 deletions

View File

@ -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,

View File

@ -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"