mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 12:59:34 +00:00
Make WS command backup/generate send events (#130524)
* Make WS command backup/generate send events * Update backup.create service
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
import asyncio
|
||||
from unittest.mock import AsyncMock, MagicMock, Mock, mock_open, patch
|
||||
|
||||
import aiohttp
|
||||
@@ -10,7 +10,10 @@ from multidict import CIMultiDict, CIMultiDictProxy
|
||||
import pytest
|
||||
|
||||
from homeassistant.components.backup import BackupManager
|
||||
from homeassistant.components.backup.manager import BackupPlatformProtocol
|
||||
from homeassistant.components.backup.manager import (
|
||||
BackupPlatformProtocol,
|
||||
BackupProgress,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.exceptions import HomeAssistantError
|
||||
from homeassistant.setup import async_setup_component
|
||||
@@ -20,59 +23,30 @@ from .common import TEST_BACKUP
|
||||
from tests.common import MockPlatform, mock_platform
|
||||
|
||||
|
||||
async def _mock_backup_generation(manager: BackupManager):
|
||||
async def _mock_backup_generation(
|
||||
manager: BackupManager, mocked_json_bytes: Mock, mocked_tarfile: Mock
|
||||
) -> None:
|
||||
"""Mock backup generator."""
|
||||
|
||||
def _mock_iterdir(path: Path) -> list[Path]:
|
||||
if not path.name.endswith("testing_config"):
|
||||
return []
|
||||
return [
|
||||
Path("test.txt"),
|
||||
Path(".DS_Store"),
|
||||
Path(".storage"),
|
||||
]
|
||||
progress: list[BackupProgress] = []
|
||||
|
||||
with (
|
||||
patch(
|
||||
"homeassistant.components.backup.manager.SecureTarFile"
|
||||
) as mocked_tarfile,
|
||||
patch("pathlib.Path.iterdir", _mock_iterdir),
|
||||
patch("pathlib.Path.stat", MagicMock(st_size=123)),
|
||||
patch("pathlib.Path.is_file", lambda x: x.name != ".storage"),
|
||||
patch(
|
||||
"pathlib.Path.is_dir",
|
||||
lambda x: x.name == ".storage",
|
||||
),
|
||||
patch(
|
||||
"pathlib.Path.exists",
|
||||
lambda x: x != manager.backup_dir,
|
||||
),
|
||||
patch(
|
||||
"pathlib.Path.is_symlink",
|
||||
lambda _: False,
|
||||
),
|
||||
patch(
|
||||
"pathlib.Path.mkdir",
|
||||
MagicMock(),
|
||||
),
|
||||
patch(
|
||||
"homeassistant.components.backup.manager.json_bytes",
|
||||
return_value=b"{}", # Empty JSON
|
||||
) as mocked_json_bytes,
|
||||
patch(
|
||||
"homeassistant.components.backup.manager.HAVERSION",
|
||||
"2025.1.0",
|
||||
),
|
||||
):
|
||||
await manager.async_create_backup()
|
||||
def on_progress(_progress: BackupProgress) -> None:
|
||||
"""Mock progress callback."""
|
||||
progress.append(_progress)
|
||||
|
||||
assert mocked_json_bytes.call_count == 1
|
||||
backup_json_dict = mocked_json_bytes.call_args[0][0]
|
||||
assert isinstance(backup_json_dict, dict)
|
||||
assert backup_json_dict["homeassistant"] == {"version": "2025.1.0"}
|
||||
assert manager.backup_dir.as_posix() in str(
|
||||
mocked_tarfile.call_args_list[0][0][0]
|
||||
)
|
||||
assert manager.backup_task is None
|
||||
await manager.async_create_backup(on_progress=on_progress)
|
||||
assert manager.backup_task is not None
|
||||
assert progress == []
|
||||
|
||||
await manager.backup_task
|
||||
assert progress == [BackupProgress(done=True, stage=None, success=True)]
|
||||
|
||||
assert mocked_json_bytes.call_count == 1
|
||||
backup_json_dict = mocked_json_bytes.call_args[0][0]
|
||||
assert isinstance(backup_json_dict, dict)
|
||||
assert backup_json_dict["homeassistant"] == {"version": "2025.1.0"}
|
||||
assert manager.backup_dir.as_posix() in str(mocked_tarfile.call_args_list[0][0][0])
|
||||
|
||||
|
||||
async def _setup_mock_domain(
|
||||
@@ -176,21 +150,26 @@ async def test_getting_backup_that_does_not_exist(
|
||||
|
||||
async def test_async_create_backup_when_backing_up(hass: HomeAssistant) -> None:
|
||||
"""Test generate backup."""
|
||||
event = asyncio.Event()
|
||||
manager = BackupManager(hass)
|
||||
manager.backing_up = True
|
||||
manager.backup_task = hass.async_create_task(event.wait())
|
||||
with pytest.raises(HomeAssistantError, match="Backup already in progress"):
|
||||
await manager.async_create_backup()
|
||||
await manager.async_create_backup(on_progress=None)
|
||||
event.set()
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("mock_backup_generation")
|
||||
async def test_async_create_backup(
|
||||
hass: HomeAssistant,
|
||||
caplog: pytest.LogCaptureFixture,
|
||||
mocked_json_bytes: Mock,
|
||||
mocked_tarfile: Mock,
|
||||
) -> None:
|
||||
"""Test generate backup."""
|
||||
manager = BackupManager(hass)
|
||||
manager.loaded_backups = True
|
||||
|
||||
await _mock_backup_generation(manager)
|
||||
await _mock_backup_generation(manager, mocked_json_bytes, mocked_tarfile)
|
||||
|
||||
assert "Generated new backup with slug " in caplog.text
|
||||
assert "Creating backup directory" in caplog.text
|
||||
@@ -247,7 +226,9 @@ async def test_not_loading_bad_platforms(
|
||||
)
|
||||
|
||||
|
||||
async def test_exception_plaform_pre(hass: HomeAssistant) -> None:
|
||||
async def test_exception_plaform_pre(
|
||||
hass: HomeAssistant, mocked_json_bytes: Mock, mocked_tarfile: Mock
|
||||
) -> None:
|
||||
"""Test exception in pre step."""
|
||||
manager = BackupManager(hass)
|
||||
manager.loaded_backups = True
|
||||
@@ -264,10 +245,12 @@ async def test_exception_plaform_pre(hass: HomeAssistant) -> None:
|
||||
)
|
||||
|
||||
with pytest.raises(HomeAssistantError):
|
||||
await _mock_backup_generation(manager)
|
||||
await _mock_backup_generation(manager, mocked_json_bytes, mocked_tarfile)
|
||||
|
||||
|
||||
async def test_exception_plaform_post(hass: HomeAssistant) -> None:
|
||||
async def test_exception_plaform_post(
|
||||
hass: HomeAssistant, mocked_json_bytes: Mock, mocked_tarfile: Mock
|
||||
) -> None:
|
||||
"""Test exception in post step."""
|
||||
manager = BackupManager(hass)
|
||||
manager.loaded_backups = True
|
||||
@@ -284,7 +267,7 @@ async def test_exception_plaform_post(hass: HomeAssistant) -> None:
|
||||
)
|
||||
|
||||
with pytest.raises(HomeAssistantError):
|
||||
await _mock_backup_generation(manager)
|
||||
await _mock_backup_generation(manager, mocked_json_bytes, mocked_tarfile)
|
||||
|
||||
|
||||
async def test_loading_platforms_when_running_async_pre_backup_actions(
|
||||
|
||||
Reference in New Issue
Block a user