mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 21:57:51 +00:00
Add restore backup tests (#136538)
* Test restore backup with busy manager * Test restore backup with agent error * Test restore backup with file error
This commit is contained in:
parent
733e1feba3
commit
1a57992e78
@ -2483,3 +2483,265 @@ async def test_restore_backup_wrong_parameters(
|
|||||||
|
|
||||||
mocked_write_text.assert_not_called()
|
mocked_write_text.assert_not_called()
|
||||||
mocked_service_call.assert_not_called()
|
mocked_service_call.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("mock_backup_generation")
|
||||||
|
async def test_restore_backup_when_busy(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_ws_client: WebSocketGenerator,
|
||||||
|
) -> None:
|
||||||
|
"""Test restore backup with busy manager."""
|
||||||
|
assert await async_setup_component(hass, DOMAIN, {})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
ws_client = await hass_ws_client(hass)
|
||||||
|
|
||||||
|
await ws_client.send_json_auto_id(
|
||||||
|
{"type": "backup/generate", "agent_ids": [LOCAL_AGENT_ID]}
|
||||||
|
)
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
|
||||||
|
assert result["success"] is True
|
||||||
|
|
||||||
|
await ws_client.send_json_auto_id(
|
||||||
|
{
|
||||||
|
"type": "backup/restore",
|
||||||
|
"backup_id": TEST_BACKUP_ABC123.backup_id,
|
||||||
|
"agent_id": LOCAL_AGENT_ID,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
|
||||||
|
assert result["success"] is False
|
||||||
|
assert result["error"]["code"] == "home_assistant_error"
|
||||||
|
assert result["error"]["message"] == "Backup manager busy: create_backup"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("mock_backup_generation")
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("exception", "error_code", "error_message"),
|
||||||
|
[
|
||||||
|
(BackupAgentError("Boom!"), "home_assistant_error", "Boom!"),
|
||||||
|
(Exception("Boom!"), "unknown_error", "Unknown error"),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
async def test_restore_backup_agent_error(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_ws_client: WebSocketGenerator,
|
||||||
|
exception: Exception,
|
||||||
|
error_code: str,
|
||||||
|
error_message: str,
|
||||||
|
) -> None:
|
||||||
|
"""Test restore backup with agent error."""
|
||||||
|
remote_agent = BackupAgentTest("remote", backups=[TEST_BACKUP_ABC123])
|
||||||
|
await async_setup_component(hass, DOMAIN, {})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await setup_backup_platform(
|
||||||
|
hass,
|
||||||
|
domain="test",
|
||||||
|
platform=Mock(
|
||||||
|
async_get_backup_agents=AsyncMock(return_value=[remote_agent]),
|
||||||
|
spec_set=BackupAgentPlatformProtocol,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
ws_client = await hass_ws_client(hass)
|
||||||
|
|
||||||
|
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["event"] == {"manager_state": BackupManagerState.IDLE}
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["success"] is True
|
||||||
|
|
||||||
|
with (
|
||||||
|
patch("pathlib.Path.open"),
|
||||||
|
patch("pathlib.Path.write_text") as mocked_write_text,
|
||||||
|
patch("homeassistant.core.ServiceRegistry.async_call") as mocked_service_call,
|
||||||
|
patch.object(
|
||||||
|
remote_agent, "async_download_backup", side_effect=exception
|
||||||
|
) as download_mock,
|
||||||
|
):
|
||||||
|
await ws_client.send_json_auto_id(
|
||||||
|
{
|
||||||
|
"type": "backup/restore",
|
||||||
|
"backup_id": TEST_BACKUP_ABC123.backup_id,
|
||||||
|
"agent_id": remote_agent.agent_id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["event"] == {
|
||||||
|
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||||
|
"stage": None,
|
||||||
|
"state": RestoreBackupState.IN_PROGRESS,
|
||||||
|
}
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["event"] == {
|
||||||
|
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||||
|
"stage": None,
|
||||||
|
"state": RestoreBackupState.FAILED,
|
||||||
|
}
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["event"] == {"manager_state": BackupManagerState.IDLE}
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert not result["success"]
|
||||||
|
assert result["error"]["code"] == error_code
|
||||||
|
assert result["error"]["message"] == error_message
|
||||||
|
|
||||||
|
assert download_mock.call_count == 1
|
||||||
|
assert mocked_write_text.call_count == 0
|
||||||
|
assert mocked_service_call.call_count == 0
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("mock_backup_generation")
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
(
|
||||||
|
"open_call_count",
|
||||||
|
"open_exception",
|
||||||
|
"write_call_count",
|
||||||
|
"write_exception",
|
||||||
|
"close_call_count",
|
||||||
|
"close_exception",
|
||||||
|
"write_text_call_count",
|
||||||
|
"write_text_exception",
|
||||||
|
"validate_password_call_count",
|
||||||
|
),
|
||||||
|
[
|
||||||
|
(
|
||||||
|
1,
|
||||||
|
OSError("Boom!"),
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
1,
|
||||||
|
None,
|
||||||
|
1,
|
||||||
|
OSError("Boom!"),
|
||||||
|
1,
|
||||||
|
None,
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
1,
|
||||||
|
None,
|
||||||
|
1,
|
||||||
|
None,
|
||||||
|
1,
|
||||||
|
OSError("Boom!"),
|
||||||
|
0,
|
||||||
|
None,
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
(
|
||||||
|
1,
|
||||||
|
None,
|
||||||
|
1,
|
||||||
|
None,
|
||||||
|
1,
|
||||||
|
None,
|
||||||
|
1,
|
||||||
|
OSError("Boom!"),
|
||||||
|
1,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
async def test_restore_backup_file_error(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_ws_client: WebSocketGenerator,
|
||||||
|
open_call_count: int,
|
||||||
|
open_exception: list[Exception | None],
|
||||||
|
write_call_count: int,
|
||||||
|
write_exception: Exception | None,
|
||||||
|
close_call_count: int,
|
||||||
|
close_exception: list[Exception | None],
|
||||||
|
write_text_call_count: int,
|
||||||
|
write_text_exception: Exception | None,
|
||||||
|
validate_password_call_count: int,
|
||||||
|
) -> None:
|
||||||
|
"""Test restore backup with file error."""
|
||||||
|
remote_agent = BackupAgentTest("remote", backups=[TEST_BACKUP_ABC123])
|
||||||
|
await async_setup_component(hass, DOMAIN, {})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await setup_backup_platform(
|
||||||
|
hass,
|
||||||
|
domain="test",
|
||||||
|
platform=Mock(
|
||||||
|
async_get_backup_agents=AsyncMock(return_value=[remote_agent]),
|
||||||
|
spec_set=BackupAgentPlatformProtocol,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
ws_client = await hass_ws_client(hass)
|
||||||
|
|
||||||
|
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["event"] == {"manager_state": BackupManagerState.IDLE}
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["success"] is True
|
||||||
|
|
||||||
|
open_mock = mock_open()
|
||||||
|
open_mock.side_effect = open_exception
|
||||||
|
open_mock.return_value.write.side_effect = write_exception
|
||||||
|
open_mock.return_value.close.side_effect = close_exception
|
||||||
|
|
||||||
|
with (
|
||||||
|
patch("pathlib.Path.open", open_mock),
|
||||||
|
patch(
|
||||||
|
"pathlib.Path.write_text", side_effect=write_text_exception
|
||||||
|
) as mocked_write_text,
|
||||||
|
patch("homeassistant.core.ServiceRegistry.async_call") as mocked_service_call,
|
||||||
|
patch(
|
||||||
|
"homeassistant.components.backup.manager.validate_password"
|
||||||
|
) as validate_password_mock,
|
||||||
|
patch.object(remote_agent, "async_download_backup") as download_mock,
|
||||||
|
):
|
||||||
|
download_mock.return_value.__aiter__.return_value = iter((b"backup data",))
|
||||||
|
await ws_client.send_json_auto_id(
|
||||||
|
{
|
||||||
|
"type": "backup/restore",
|
||||||
|
"backup_id": TEST_BACKUP_ABC123.backup_id,
|
||||||
|
"agent_id": remote_agent.agent_id,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["event"] == {
|
||||||
|
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||||
|
"stage": None,
|
||||||
|
"state": RestoreBackupState.IN_PROGRESS,
|
||||||
|
}
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["event"] == {
|
||||||
|
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||||
|
"stage": None,
|
||||||
|
"state": RestoreBackupState.FAILED,
|
||||||
|
}
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert result["event"] == {"manager_state": BackupManagerState.IDLE}
|
||||||
|
|
||||||
|
result = await ws_client.receive_json()
|
||||||
|
assert not result["success"]
|
||||||
|
assert result["error"]["code"] == "unknown_error"
|
||||||
|
assert result["error"]["message"] == "Unknown error"
|
||||||
|
|
||||||
|
assert download_mock.call_count == 1
|
||||||
|
assert validate_password_mock.call_count == validate_password_call_count
|
||||||
|
assert open_mock.call_count == open_call_count
|
||||||
|
assert open_mock.return_value.write.call_count == write_call_count
|
||||||
|
assert open_mock.return_value.close.call_count == close_call_count
|
||||||
|
assert mocked_write_text.call_count == write_text_call_count
|
||||||
|
assert mocked_service_call.call_count == 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user